Objective c 目标C:将自动释放的对象设置为零

Objective c 目标C:将自动释放的对象设置为零,objective-c,Objective C,将自动释放对象设置为零安全吗?我知道我不需要释放自动释放的对象,但是如果我想立即释放该对象以最小化内存使用,我可以将该对象设置为零吗 我可能在前一段时间的某个地方读过这篇文章,但我不记得在哪里读过,我想确保这样做是安全的。是的,这是一个很好的实践,因为它表明对象未被使用-即没有引用数据 不管它值多少钱,你也可以在苹果的示例代码中看到它。我认为你遗漏了一些非常基本的东西。将对象设置为nil对内存管理没有任何帮助。下面是发生的事情: 在这幅图中,您有一个堆栈(局部变量所在的位置;它或多或少与您当前在

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


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

是的,这是一个很好的实践,因为它表明对象未被使用-即没有引用数据


不管它值多少钱,你也可以在苹果的示例代码中看到它。

我认为你遗漏了一些非常基本的东西。将对象设置为
nil
对内存管理没有任何帮助。下面是发生的事情:

在这幅图中,您有一个堆栈(局部变量所在的位置;它或多或少与您当前在执行代码时所处的位置同义)。如果您声明类似
intbar=42,然后
就存在于堆栈上。右边是堆。这是属于应用程序的全局内存空间。堆的发明是为了解决范围问题:如何使有用的信息超出当前函数(或方法)的范围。当我们
malloc
space时,会在堆上分配一个内存插槽。当您
alloc/init
一个对象时,该对象位于堆上。在Objto-C中,所有对象都在堆中生存。*我们考虑这一行:

MyObject * foo = [[MyObject alloc] init];
我们确实有两件事要做。首先,我们在堆上分配了(
alloc
)一个新的空间块,它足够大,可以容纳
MyObject
结构。然后我们获取了内存块的位置,并将其赋给一个名为
foo
的局部变量。在上图中,左侧的红色圆圈是
foo
,右侧的红色斑点是实际的
MyObject
(及其所有数据)。到目前为止有意义吗

下面是“将对象设置为
nil
”(
foo=nil;
)时发生的情况

您将看到对象仍然存在于堆上。事实上,唯一改变的是局部变量
foo
不再指向堆上的内存块。它指向
0
nil
NULL
,不管你怎么称呼它),这就是我们如何表示“这不再指向任何相关的东西”

简而言之:将变量设置为nil与内存管理无关。如果要立即删除对象,请使用
release
而不是
autorelease
。但是,即使这样,也不能保证“立即销毁”,因为可能会有其他东西
retain
ing对象(这就是使用retain-release内存管理模型的全部意义)

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

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


*除了本地块,但仅在复制它们之前。还有一些其他的注意事项,但这已经进入了一个神秘的阶段。

将自动释放对象设置为nil是安全的,在某些情况下,它有助于通过代码显示您的意图。但是,将对象设置为nil不会导致立即释放它。只有在自动释放池耗尽后,它才会被释放。这是一个非常重要的概念,当涉及到内存管理时,需要理解这一概念。有很多objective-c文献没有阐明这一点,我认为很多开发人员可能会将ARC与Java等传统垃圾收集模型混淆。我很高兴证实我对它的理解是正确的,因为即使是我也对它提出了质疑。我明白了,用插图来加强它+1.@bbum我希望这些图片现在不是404的(因为mobileMe关闭了商店)。我是视觉学习者!:)不管怎么说,回答很好,投了赞成票@taber dang,我把原件弄丢了。听起来你把垃圾收集器和自动释放池搞混了。在GC环境中,将对象引用设置为
nil
有一个好处,否则该对象引用将是持久的。但是GC即使在Mac上也不经常使用,在iOS上也不可用。设置
nil
可能还有一些潜在的好处,例如确保没有留下过时的指针来诱捕粗心的程序员,但这不会影响内存管理。@walkytalky同意。我从来没有说过GC。我刚才提到这是一个很好的练习。出于你提到的同样原因——保证清洁。足够公平。但在这种情况下,很难理解“它让内存池知道它未使用——即没有引用数据”这句话的含义。