【问题标题】:Object c property dealloc, which one is correct? [duplicate]对象c属性dealloc,哪一个是正确的? [复制]
【发布时间】:2012-12-03 15:29:39
【问题描述】:

可能重复:
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];
}

【问题讨论】:

标签: iphone objective-c ios ipad properties


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的第二个选项是不可取的。属性设置器可能有副作用,通常不会在考虑到对象可能已经被拆掉一半的情况下实施。一般来说,除了[super dealloc] 之外,您应该避免从dealloc 对self(或super)的任何方法调用。您还应该避免对其他对象进行重要的调用(即除了释放之外的任何调用),因为您可能有循环引用,这些引用可能会导致对半释放对象的引用。

    第一个选项就足够了。请注意,如果您使用 ARC,则它是多余的。使用 ARC 始终是您的最佳选择,因为它不仅更安全,而且速度更快。

    第三个选项是有争议的。有些人认为它使您的程序对错误更具弹性(因为在 dealloc 之后的引用可能以零实例变量结束,而不是通过它弹跳和段错误,或更糟)。他们还争辩说,它确保如果您确实运行一个尝试使用该值的方法,它可能会优雅地失败(再次,而不是在此时取消引用什么是悬空指针)。但是,如果您同意我关于避免这种情况的第一点,那就有点没有意义了。而我的经验是,依赖这种行为是一个坏主意——即使它一开始是一个干净的设计,也很容易忘记它并最终在一段时间后更改代码,从而破坏它。

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

    【讨论】:

      【解决方案3】:

      你不应该在 dealloc 中调用self.

      一旦您拥有release-ed,那么将其设为nil 就没有任何优势。

      所以,第一个是使用dealloc的正确方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 2013-01-01
        • 2011-03-14
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多