0

我最近看到这篇博客文章,其中讨论了两种实例变量释放。给大家总结一下:

第一种方法

- (void)dealloc {
  [instanceVar release];
  [super dealloc];
}

被认为使指针保持活动状态,直到方法返回。这可能导致未定义的行为。第二种方法

- (void)dealloc {
  [instanceVar release], instanceVar = nil;
  [super dealloc];
}

被认为对于生产代码更稳定,因为instaceVar设置为 nil。

好的。这是您一直在等待的问题:两种解决方案是否相同?或者表达式的逗号分隔是否使它们具有原子性?

4

2 回答 2

2

您链接到的博客文章来自 2010 年。

现在更有趣的一点是,您两者都不必做。如果您使用 ARC,则无法向对象发送释放消息。

after release的设置nil是为了防止非保留对象在被释放后被发送消息而导致崩溃。我说非保留对象,因为如果它们是保留对象,它们就不会(不应该)在不知不觉中被释放。同样,使用 ARC(只要您不使用 ARC-lite),您可以将非保留对象标记为weak,并且弱指针自动归零;即当他们指向的对象被释放时,指针被设置为nil。

所以第二种情况,指针被设置nil在dealloc之后,在运行时被认为更安全,但你现在不必担心它,因为ARC会为你处理。

于 2013-02-12T11:10:12.213 回答
1

逗号不会使它成为原子,但dealloc无论如何都应该只有一个线程调用,否则你手上会有很多更大的问题。设置instanceVarnil是不必要的,它并不安全,因为如果你的程序中有一个错误以某种方式使用了悬空值,instanceVar那么它只会根据它是nil或其他东西而不同地表现出来,无论哪种方式,都有一个错误,因为没有什么应该依赖这个值。

对于 ARC,这不再是一个问题。ARC 中的一个dealloc方法仅用于释放非 ARC 控制的资源,其他一切都会自动为您处理。

于 2013-02-12T10:40:32.830 回答