对象c属性dealloc,哪一个是正确的?

时间:2012-12-16 05:21:51

标签: iphone objective-c ios ipad properties

  

可能重复:
  Dealloc method in iOS and setting objects to nil

对于对象c中的属性dealloc,我看到了不同种类的形式。以下哪一项最佳/正确

//Kind1:
- (void)dealloc
{
    [_property release];
    [super dealloc];
}

//Kind2:
- (void)dealloc
{
    self.property = nil;
    [super dealloc];
}

//Kind3:
- (void)dealloc
{
    [_property release]; _property = nil;
    [super dealloc];
}

3 个答案:

答案 0 :(得分:2)

你的第二个选择是不可取的。属性设置器可能具有副作用,并且通常不考虑对象可能已经被拆除一半而实现。一般来说,除了[super dealloc]之外,你应该避免从dealloc对self(或super)的任何方法调用。你还应该避免在其他对象上进行非平凡的调用(即除了释放之外的任何东西),因为你可能有循环引用,可以返回对你的半释放对象的引用。

第一种选择就足够了。请注意,如果使用ARC,则它是多余的。使用ARC是最好的选择,因为它不仅更安全而且更快。

第三种选择是有争议的。有些人认为它会使你的程序对错误更具弹性(因为dealloc之后的引用可能会在归零的实例变量处结束,而不是通过它反弹并出现错误,或者更糟)。他们还认为,如果你运行一个试图使用该值的方法,它可能会优雅地失败(再次,而不是解除引用那个点上的悬空指针)。但是如果你赞成我的第一点就是避免这种情况开始,那就变得没有实际意义了。而我的经验是依赖于这种行为是一个坏主意 - 即使它是一个干净的设计开始,它很容易忘记它并最终在一段时间后以一种打破它的方式更改代码。

那些不喜欢第三种选择的人也认为它隐藏了错误。有些人甚至明确地用nil覆盖而不是明显的虚假值(例如0x0badf00d),以便在取消引用悬空指针时使其更清晰。

答案 1 :(得分:1)

Kind1绰绰有余; 在alloc和dealloc上使用'self'通常不是一个好主意。 coz self会调用setter / getter方法,如果你有自定义setter / getter方法,它会导致麻烦。

答案 2 :(得分:1)

你永远不应该在dealloc中调用self.

一旦你有了release - ed那么就没有任何优势nil

因此,第一个是使用dealloc的正确方法。