在Objective-C中用逗号分隔的表达式

时间:2013-02-12 10:33:39

标签: objective-c

我最近遇到了this blog post,其中讨论了两种实例变量释放。为您提供摘要:

第一种方法

- (void)dealloc {
  [instanceVar release];
  [super dealloc];
}
在方法返回之前,

被认为是指针处于活动状态。这可能导致未定义的行为。 第二种方法

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

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

行。这是你一直在等待的问题: 两种解决方案都一样吗?或者表达式的逗号分隔是否使它们成为原子?

2 个答案:

答案 0 :(得分:2)

您链接的博客文章是2010年。

现在更有趣的一点是你不得不这样做。如果使用ARC,则无法向对象发送释放消息。

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

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

答案 1 :(得分:1)

逗号不会使它成为原子,但是应该只有一个线程调用dealloc,否则你手上会遇到更大,更大的问题。将instanceVar设置为nil是不必要的,它不是更安全,因为如果您的程序中存在以某种方式使用instanceVar中的悬空值的错误,则只会根据是否有所不同而有所不同它是nil或其他东西,无论哪种方式,都有一个错误,因为没有应该依赖于该值。

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