gpt4 book ai didi

Objective-C:将自动释放的对象设置为 nil

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:33 24 4
gpt4 key购买 nike

将自动释放对象设置为 nil 是否安全?我知道我不需要释放一个自动释放的对象,但如果我希望立即释放该对象以最小化内存使用,我可以将该对象设置为 nil 吗?

我之前可能在某个地方读过这篇文章,但我不记得是在哪里读到的,我想确保这样做是安全的。

最佳答案

我认为您遗漏了一些非常基本的东西。就内存管理而言,将对象设置为 nil 对您没有任何帮助。这是发生了什么:alt text http://gallery.me.com/davedelong/100084/Pointers1/web.png?ver=12783505480001

在此图像中,您有堆栈(局部变量所在的位置;它或多或少与您当前在代码中执行时所处的位置同义)。如果您声明类似 int bar = 42; 的内容,则 bar 位于堆栈中。在右边你有堆。这是属于您的应用程序的全局内存空间。发明堆是为了解决作用域问题:如何让有用的信息活在当前函数(或方法)的作用域之外。当我们malloc 空间时,我们在堆上分配了一个内存槽。当您alloc/init 一个对象时,该对象位于堆上。在 Objective-C 中,所有对象都在堆上。* 所以让我们考虑一下这一行:

MyObject * foo = [[MyObject alloc] init];

我们确实有两件事正在进行。第一个是我们已经在堆上分配 (alloc) 一个新的空间 block ,它足够容纳一个 MyObject 结构。然后,我们获取了该内存块的位置并将其分配给名为 foo 的局部变量。在上图中,左侧的红色圆圈是 foo,右侧的红色 Blob 是实际的 MyObject(及其所有数据)。到目前为止有意义吗?

这是当您“将对象设置为 nil”时发生的情况 (foo = nil;) alt text http://gallery.me.com/davedelong/100084/Pointers2/web.png?ver=12783505490001

您会看到该对象仍然存在于堆中。事实上,唯一发生变化的是您的局部变量 foo 不再指向堆上的内存块。它指向 0(nilNULL,随便你怎么调用它),这就是我们如何表示“this doesn't point任何相关的东西”。

简而言之:将变量设置为 nil 与内存管理无关。如果您想立即摆脱一个对象,请使用 release 而不是 autorelease。然而,即使那样也不能保证“立即销毁”,因为其他东西可能保留对象(这是使用保留-释放内存管理的重点型号)。

除此之外,一旦你完成了一个对象(并且在你调用了 releaseautorelease 之后),设置变量仍然是个好主意nil,只是为了避免潜在的问题。在 Objective-C 中,我们可以安全地将消息发送到 nil 而不会在我们面前爆炸(不像 Java)。但是,如果您不“消除”一个变量,就会发生不好的事情。假设 foo 指向一个 MyObject 实例,然后 MyObject 实例被销毁(您 released ,但没有将其设置为 nil)。如果您尝试再次调用 foo 上的方法,您的应用程序将会崩溃。如果您确实将 foo 设置为 nil,那么您的应用程序将继续运行。它可能不会您所希望的,但那是完全不同的问题。

欢迎来到 Objective-C 内存管理的精彩世界。

* 除了本地 block ,但只有在它们被复制之前。对此也有一些其他注意事项,但这是进入奥术。

关于Objective-C:将自动释放的对象设置为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3180948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com