Objective c 是否有必要将指定的变量设为零?

Objective c 是否有必要将指定的变量设为零?,objective-c,memory-management,Objective C,Memory Management,在某些代码中,我有时会看到: @property (nonatomic, assign) NSObject *foo; ... -(void)dealloc { self.foo = nil; ... } 当一个对象没有被保留时,是否真的有必要将其置零?这实际上不会导致问题吗?假设它是一个合成的访问器,那么在dealloc中执行它是没有意义的。早些时候,如果您不想再与对象交谈,您可能会将其置为零。不过,我看不出这会造成什么问题 如果它不是合成访问器,setter也可能以某种方式

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

@property (nonatomic, assign) NSObject *foo;

...

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

当一个对象没有被保留时,是否真的有必要将其置零?这实际上不会导致问题吗?

假设它是一个合成的访问器,那么在dealloc中执行它是没有意义的。早些时候,如果您不想再与对象交谈,您可能会将其置为零。不过,我看不出这会造成什么问题


如果它不是合成访问器,setter也可能以某种方式影响反向关系,在这种情况下,可能需要将其设置为nil,以便告诉
foo
您将不再存在。

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


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

最好将您不再感兴趣的任何指针设置为nil。我不主张在
-dealloc
中使用这样的访问器,因为访问器可能会产生副作用(如发布通知或KVO),但这是一个有争议的立场,苹果在自己的代码中并不一致。在任何情况下,将指针置零都是一种好的做法。它当然不会引起问题,并且在
-dealoc
中零指针的习惯将在将来为您节省大量的bug


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

我只是想知道是否需要这样做,这样我就可以避免未知的错误和许多令人头痛的问题。有一件事我很困惑,那就是变量是如何分配的。我想,当我将self.foo赋值为nil时,赋值给它的另一个假设变量不也会被设置为nil吗?我很难解释我的问题,所以如果您理解的话,请告诉我:)实例变量foo(在本例中,我们假定它支持self.foo,但我们无法从代码中知道)是指向对象的指针。将其设置为nil时,您正在移动指针,而不是更改对象(或指向该对象的任何其他指针)。您应该避免将来的麻烦和bug,这就是为什么您应该习惯在dealloc中将所有ivar指针设置为nil(以及释放您保留的任何指针)。