我为什么要使用(在我的 dealloc 方法中)?
[myInstance release]
而不是 [self.myInstance release]
myInstance = nil
而不是 self.myInstance = nil
虽然我们使用 self.myInstance = [[[AClass alloc] init] autorelease]
而不是 myInstance = [[[AClass alloc] init] autorelease]
?
这些做法来 self 在网络上看到的大量示例。
1) [myInstance release] instead of [self.myInstance release]
更喜欢前者。
self.myInstance
的返回值是在子类重写了myInstance
方法时由实现定义的。您对在 dealloc 期间构造对象的接口(interface)的行为不感兴趣(因为子类可能会覆盖并返回除您的 ivar 之外的其他内容)。
你对 dealloc 感兴趣的是在你的对象被销毁之前释放你拥有的引用。如果子类覆盖了 myInstance
,那么它可以:
a) 返回一个已经发布的 ivar(在子类中声明)
或
b) 覆盖的实现可能会返回一个新创建的自动释放对象
a 或 b 都可能导致过度释放和崩溃(假设其他所有内容都正确保留/释放)。这也说明了为什么在释放 ivar 后应该将 nil 分配给它。
这也是如何触发对象复活的经典示例。当您调用的 getter/setter 的实现在其已被释放后重新创建其状态时,就会发生对象复活。最小的攻击性副作用会导致无害的泄漏。
2) myInstance = nil instead of self.myInstance = nil
再次,更喜欢前者。
正式的回应看起来很像对#1的回应——基本原理、副作用和危险也适用于此。
最安全的处理方法是直接访问 ivar:
[myInstance release], myInstance = nil;
因为可能存在难以重现的非常糟糕的副作用(崩溃、泄漏、复活)。
这些危险可以很容易地避免,并且您的代码将更容易维护。另一方面,如果人们在使用您的程序时遇到副作用,他们可能会尽可能避免(重新)使用它。
祝你好运
关于ios - 为什么 myInstance = nil 而不是 self.myInstance = nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4895189/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |