我通常在使用后通过
释放对象[myObject release];
但我在一些在线教程中发现,在释放对象后,他们会分配 nil 。像
[myObject release];
myObject = nil;
是否需要?
答案 0 :(得分:29)
关于在释放之后是否需要将指针设置为nil
,这是一个长期争论,但我认为这是一个好主意。
释放对象后,您持有的指针仍然指向同一个位置。如果您的发布已将保留计数设置为0,则将取消分配该对象。如果您尝试向解除分配的对象发送消息,则会收到EXC_BAD_ACCESS错误。但是,在将指针设置为nil
后向其发送消息不会出错 - 它只是不会做任何事情。
论证的另一方面是,如果你要发送一个解除分配的对象,最好知道它并修复你的代码以确保它不会发生。
两个阵营都有聪明人。
答案 1 :(得分:3)
不,这不是严格要求的。
如果您的代码结构合理,则无需强制myObject
等于nil。
然而,这可能是一个好习惯:release
不会立即销毁对象,只会减少retain
计数。因此,即使您调用release,该对象仍可能存在一段时间,如果您尝试向其发送消息,则会产生问题。
使用myObject = nil;
可以消除此问题,因为即使您向myObject
发送消息,也不会发生任何事情。
答案 2 :(得分:2)
这不是必需的,但主要是样式问题。在发布后分配nil
可确保您不会意外地再次使用已发布的引用(可能会或可能不会导致崩溃)。简单地在引用上调用release
可能会使底层内存消失。但是,指针仍将指向(现在可能无效)地址,并且使用该指针的后续方法调用的结果是未定义的。
答案 3 :(得分:2)
不,这不是必需的。
这是安全的事情。如果你有
[myObject release];
然后你做的其他地方
[myObject doSomething];
然后你会遇到问题。
如果你有
[myObject release];
myObject = nil;
然后你做的其他地方
[myObject doSomething];
然后什么都不会发生,因为你正在调用一个零对象。所以你的应用程序不会只是陷入大堆。或者,如果您在代码中有其他地方
[myObject release];
然后它将在nil对象上释放,因此不会过度释放。
显然你应该避免调用你已经发布的对象!
答案 4 :(得分:2)
我总是设置为nil。
Apple自己有时(记录)检查nil。
示例; 强>
如果您想要恢复使用navigationItem.titleView
,则需要将nil
设置为navigationItem.title
,否则您的标题将不会显示。
有很多引用这个" nil检查"在Apple文档中。
参考;
Restoring navigationItem.title after removing navigationItem.titleView
答案 5 :(得分:1)
不是真的,但最好用它来防止错误...
如果你在代码myObject中的某个地方调用它时它会给你一个错误的错误, 但是,如果它被设置为零则错误可能被绕过
如果您尝试:
myObject.someProperty = 1;
或
if (myObject) {...}
你刚刚发布了myObject,它可能会崩溃你的应用......
答案 6 :(得分:1)
这不是必需的,但它通常被认为是所有环境中的良好实践,除了在-dealloc
方法中通常认为它是不必要的。
在发布后将对象指针设置为nil是很常见的原因是因为Objective-C方法调度程序不会尝试向nil对象发送消息,这意味着以后可以安全地意外使用该对象
答案 7 :(得分:0)
在发布一个abject但是没有赋值NULL之后,它会保留地址但内容被释放。所以现在它没有指向任何有效的内存location.Hence ptr现在悬挂指针,它可能有一个地址但没有指向任何有效的内存位置。 因此,最好在释放分配的内存后分配NULL,如下所示
PTR = NULL;
通过这种方式,悬空问题将得到解决。答案 8 :(得分:0)
我建议采用混合方法。让我们看看典型的应用程序要求:
一个好的解决方案是有条件地分配给:
这为生产版本带来了稳定性,但在调试模式下,任何访问该变量的尝试都将明确地使应用程序崩溃。请注意,对象的调用释放不保证将删除对象内存,因此需要显式设置为错误的指针。
#ifdef DEBUG
#define RELEASE(obj) [(obj) release]; (obj) = (id)0x20;
#else
#define RELEASE(obj) [(obj) release]; (obj) = nil;
#endif
答案 9 :(得分:-2)
在几年前的Apple Tech Talk上,Apple工程师讨论了几个必须分配给nil的实例,但我不记得除了在所讨论的实例中的dealloc之外的其他细节。我只想说说你从来没有这样做是不正确的,或者这样做是不好的做法。有时你必须这样做。但大多数时候你没有必要。对不起,我的记忆并不清楚。