【问题标题】:is it necessary to nil an assigned variable?是否有必要将分配的变量归零?
【发布时间】:2009-07-22 02:19:10
【问题描述】:

在某些代码中我有时会看到:

@property (nonatomic, assign) NSObject *foo;

...

-(void)dealloc
{
   self.foo = nil;
   ...
}

当一个对象没有被保留时,真的有必要将它归零吗?这真的不会造成问题吗?

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    最好将您不再感兴趣的指针设置为 nil。我不提倡在-dealloc 中使用这样的访问器,因为可能存在访问器副作用(例如发布通知或KVO),但这是一个有争议的立场,Apple 在他们自己的代码中并不一致。在任何情况下,将指针归零是一种很好的做法。这当然不会造成问题,并且在-dealloc 中将指针归零的习惯将在将来为您节省重大错误。

    在这种特定情况下,可能没有必要,但你建议什么样的问题?

    【讨论】:

    • 我只是想知道是否需要它,这样我就可以避免未知的错误和许多令人头疼的问题。我感到困惑的一件事是如何分配变量。我认为当我将 self.foo 分配给 nil 时,分配给它的另一个假设变量不会也设置为 nil 吗?我很难解释我的问题,所以如果你理解,请告诉我:)
    • 实例变量 foo(我们假设在这种情况下支持 self.foo,但我们无法从这段代码中知道)是一个指向对象的指针。当您将其设置为 nil 时,您正在移动指针,而不是更改对象(或指向该对象的任何其他指针)。您尝试避免将来的麻烦和错误是正确的,这就是为什么您应该养成在 dealloc 中将所有 ivar 指针设置为 nil 的习惯(以及释放您保留的任何指针)。
    【解决方案2】:

    assign 属性不必在 -dealloc 中将其 ivar 设置为 nil。

    在 -dealloc 中将 ivar 设置为 nil 是无害的。在 dealloc 中使用公共访问器将属性设置为 nil([self setFoo: nil] 或 self.foo = nil)可能会产生不希望的副作用。

    【讨论】:

      【解决方案3】:

      假设它是一个综合访问器,那么在 dealloc 中执行它是没有意义的。早些时候,如果您不想再与对象交谈,您可能会取消它。不过,我看不出它会如何导致问题。

      如果它不是合成访问器,setter 也可能以某种方式影响反向关系,在这种情况下,可能需要将其设置为 nil 以告诉 foo 你不会出现没有了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-19
        • 1970-01-01
        • 2023-03-13
        • 2019-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-07
        相关资源
        最近更新 更多