1)将myInstance发布]而不是[self.myInstance发布]
更喜欢前者。
self.myInstance
的返回值由子类已重写方法myInstance
的实现定义。你对dealloc期间构造对象的接口行为不感兴趣(因为子类可能会覆盖并返回除你的ivar以外的东西)。
你对dealloc感兴趣的是在你的对象被销毁之前释放你拥有的引用。如果子类已覆盖myInstance
,那么它可以:
一)返回伊娃(在子类中声明),这已经被释放
或
二)覆盖的实施可能会返回一个新创建自动释放对象
a或b可能导致过度释放和崩溃(假设其他所有内容都正确保留/释放)。这也说明了为什么你应该在释放伊利尔后将它分配给伊娃。
这也是如何触发对象复活的经典例子。当你调用的getter/setter的实现在它已经被释放后重新创建它的状态时,就会发生对象复活。最少的攻击性副作用会导致无害的泄漏。
2)将myInstance =零,而不是self.myInstance =零
再次,倾向于前者。
正式回复看起来很像对#1的回应 - 理由,副作用和危险也适用于此处。
来处理这个最安全的方式是直接访问伊娃:
[myInstance release], myInstance = nil;
,因为有可能是得了很严重的副作用(崩溃,泄漏,复活),这可能是难以重现。
这些危险可能很容易避免,您的代码将更容易维护。另一方面,如果人们在使用你的程序时遇到了副作用,他们可能会避免(重新)使用它。
好运
请搜索该网站。这个问题以前已经出现过很多次了。 – 2011-02-04 07:59:01