为什么要使用(在我的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/

    10-13 01:18