我最近遇到了this blog post,其中讨论了两种实例变量释放。为您提供摘要:
第一种方法
- (void)dealloc {
[instanceVar release];
[super dealloc];
}
在方法返回之前,被认为是指针处于活动状态。这可能导致未定义的行为。 第二种方法
- (void)dealloc {
[instanceVar release], instanceVar = nil;
[super dealloc];
}
被认为对生产代码更稳定,因为 instaceVar 设置为nil。
行。这是你一直在等待的问题: 两种解决方案都一样吗?或者表达式的逗号分隔是否使它们成为原子?
答案 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控制的资源,其他所有内容都会自动为您处理。