Objective c self.property变为nil vs[ivar release]案例结束

Objective c self.property变为nil vs[ivar release]案例结束,objective-c,Objective C,关于为什么不应该像在viewDidUnload中那样在Dealoc中使用setter,已经有很多讨论。问题是,为什么不在dealloc或viewDidUnload中都使用[property release]?这不是结束了讨论吗?还是有理由改为在viewDidUnload中执行self.property=nil 也就是说,我们在任何事情上都遵循这个习惯用法,而不是在viewDidUnload中使用一种形式,在dealoc中使用另一种形式,这似乎毫无意义 [ivar release]; ivar =

关于为什么不应该像在viewDidUnload中那样在Dealoc中使用setter,已经有很多讨论。问题是,为什么不在dealloc或viewDidUnload中都使用[property release]?这不是结束了讨论吗?还是有理由改为在viewDidUnload中执行self.property=nil

也就是说,我们在任何事情上都遵循这个习惯用法,而不是在viewDidUnload中使用一种形式,在dealoc中使用另一种形式,这似乎毫无意义

[ivar release];
ivar = nil;

属性是保存的,因此您可以在任何地方设置nil,因为它们保存释放(setter看起来像
-(void)setProp{[prop release];self.prop=nil;}
)。
但是如果您使用
[something release]
,应该在
viewDidLoad
方法中执行,因为视图可以卸载,但控制器不能解除分配,这意味着
viewDidLoad
中可能存在内存泄漏。如果您两次调用
[something release]
,它会因为错误的计数器减少而导致崩溃一般的想法是,在dealloc之后,对象不会发生任何事情,所以您可以只释放属性,而不必担心它是无效指针。另一方面,如果在VisualDunLoad中执行[属性发布]而不将其设置为NIL,则它将包含无效指针,如果在将新的有效值分配给它之前使用该属性可能导致崩溃。

< P>所有其他响应都认为这两种方式相同。但是当你有原子属性时考虑一下。这是一个批次比“纯”方式更短更干净。

我的意思是我们将始终遵循[ivar release]和ivar=nil;作为惯例。无论在哪里发布,将ivar设置为nil都是一个很好的实践。那么为什么不使用selv.ivar=nil呢?这是完全相同的东西,但更短。self.property=。。。还可以进行比较和锁定(除非声明为非原子)。我更喜欢避免不必要的代码,所以在dealloc中只使用[property release]。在viewDidUnload中,在某些情况下,使用self.property=nil可能比[prop release]和prop=nil更安全。@fbernardo-因为self.ivar可能存在其他SO帖子带来的问题,例如KVO和其他副作用。@Boon是的,我在回答中指出了锁定,完全忘记了KVO,我想我不会经常使用它:)如果你总是将ivar设置为零,你就永远不会过度释放。纯粹主义者坚持这样那样,但最重要的是选择一个对你有意义的方案,并始终如一地使用它(至少在给定的应用程序中),这样你就不会混淆自己。我个人喜欢使用
self.propname=nil无处不在,甚至在
dealloc
中。