self.property to nil vs [ivar release] case close

时间:2012-03-15 23:41:32

标签: objective-c

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

也就是说,我们总是遵循这个习惯用法 - 而不是在viewDidUnload中使用一个表单而在dealloc中使用另一个表单,这似乎毫无意义。

[ivar release];
ivar = nil;

3 个答案:

答案 0 :(得分:2)

一般的想法是,在dealloc之后对象不会发生任何事情,所以你可以释放属性而不用担心它是无效指针。另一方面,如果你在viewDidUnload中执行[property release]并且没有将它设置为nil,它将包含无效指针,如果在分配新的有效值之前使用了属性,这可能会导致崩溃。

答案 1 :(得分:0)

为此保存属性,你可以在任何地方设置nil,因为它们保存释放(setter看起来像-(void)setProp { [prop release]; self.prop = nil; })。 但是如果使用[something release],则应该在viewDidUnload方法中执行此操作,因为可以卸载视图,但不取消分配控制器,这意味着viewDidLoad中可能存在内存泄漏。如果你两次调用[something release],它会导致错误的减少计数器崩溃

答案 2 :(得分:0)

所有其他回复都认为两种方式相同。但是考虑什么时候你有一个原子属性。 很多比“纯粹”方式更短更干净。