为什么要使用(在我的dealloc方法内部)?
[myInstance release]
代替[self.myInstance release]
myInstance = nil
代替self.myInstance = nil
尽管我们使用
self.myInstance = [[[AClass alloc] init] autorelease]
而不是myInstance = [[[AClass alloc] init] autorelease]
?这些做法来自我在网上看到的众多示例。
最佳答案
1)[myInstance版本]代替[self.myInstance版本]
更喜欢前者。
当子类重写self.myInstance
方法时,实现会定义myInstance
的返回值。您对dealloc期间构造对象的接口的行为不感兴趣(因为子类可能会覆盖并返回除ivar之外的其他值)。
您对dealloc感兴趣的是在销毁对象之前释放您拥有的引用。如果子类已重写myInstance
,则它可以:
a)返回一个已经被释放的ivar(在子类中声明)
要么
b)覆盖的实现可能返回一个新创建的自动释放对象
a或b可能导致过度释放和崩溃(假设其他所有内容均正确保留/释放)。这也说明了为什么在释放ivar后应该将nil分配给它。
这也是如何触发对象复活的经典示例。当您调用的getter / setter的实现在已释放后重新创建其状态时,就会发生对象复活。最少的不良影响会导致无害的泄漏。
2)myInstance = nil而不是self.myInstance = nil
再次,更喜欢前者。
形式上的回应看起来很像对#1的回应-原理,副作用和危险在这里也适用。
解决此问题的最安全方法是直接访问ivar:
[myInstance release], myInstance = nil;
因为可能确实存在令人讨厌的副作用(破裂,渗漏,复活),可能难以复制。
这些危险很容易避免,您的代码也更容易维护。另一方面,如果人们在使用您的程序时遇到副作用,则他们可能会尽可能地避免(重新)使用它。
祝好运
关于ios - 为什么用myInstance = nil代替self.myInstance = nil?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4895189/