【问题标题】:Is it correct to write [self.someproperty release]写 [self.someproperty release] 是否正确
【发布时间】:2011-08-03 20:08:37
【问题描述】:

当我实现dealloc方法时,我曾经写过:

[preopertyX release];

今天我发现了这段代码:

[self.propertyX release];

我不确定这种方法是否完全正确。你有什么想法 ? (我们可以假设 propertyX 是保留和合成的属性)。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    如果你设置了propertyX,你可以写[self.propertyX release],否则不合成

    【讨论】:

    • 在您看来,它的行为就像我是否写 [propertyX release]?
    • 如果财产是(副本),您还必须释放。我会避免使用 self.propertyX,因为有一个机会(一个很小的机会,但仍然......)子类可能会实现一个 getter 方法,该方法具有在 -dealloc 中不合适的副作用。
    • @Sherm Pendley:self.property = nil; 也会在被释放的对象上触发 KVO。
    【解决方案2】:

    根据我的理解,您应该将其设置为 nil,或者您可以释放实例变量。

    [self setPropertyX:nil]
    

    [propertyX release]
    

    您列出的方法可能会产生不必要的副作用,但如果您希望 setter 的副作用发生,我建议设置为 nil。

    这里接受的答案:iPhone - dealloc - Release vs. nil 非常好。

    这是一场精彩的辩论,非常生动地概述了可供您使用的方法。

    http://iphonedevelopment.blogspot.com/2010/09/dealloc.html 随后是 http://www.red-sweater.com/blog/1423/dont-coddle-your-code

    【讨论】:

    • 我认为您在谈论分配零。 (使用=)设置为 nil 应该非常像释放,但无论您在 setter 中设置了什么副作用
    • 也许我错了,但是,如果属性被合成,设置为 nil 类似于 release,因为自动合成属性的第一步是:[property release]; property = new_value(本例 = nil);
    • 博文中的多线程参数是假的。首先,设置为 nil 位并不能防止错误,其次,如果其他线程持有对它的引用,为什么要释放对象?
    • @JeremyP - 这就是第二篇博文出现的原因!
    • @griotspeak:是的,直到我发表评论后我才阅读它:)
    猜你喜欢
    • 2021-05-14
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多