为什么在iPhone中使用three20中的TT_RELEASE_SAFELY?

问题描述:

#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; } 

为什么three20认为可以安全地将ivar在发布后归零?忽略ivar = nil步骤是不安全的吗?为什么在iPhone中使用three20中的TT_RELEASE_SAFELY?

这是我发现: http://github.com/facebook/three20/commit/1b946f475fb28d60e0aafc9ef394050c642c3a5b#commitcomment-115517

我不认为我使用KVO/KVC,但我真的不知道。我现在正在阅读。

谢谢!

马特

当在-dealloc里面时,这个问题会分裂Objective-C专家。例如阅读最近的blog entry

当在其他方法的实现中,我个人的观点是你首先应该在发布之后不要将变量保留在范围内。此代码

SomeClass* someObject= ... 
    ... use someObject ... 
    [someObject release]; 
    ... more code ... 

可能在代码中意外地访问someObject,从而导致崩溃。所以,你可能会说

SomeClass* someObject= ... 
    ... use someObject ... 
    [someObject release]; 
    someObject=nil; 
    ... more code ... 

会更好,因为消息来nil是无害的。 然而,在这种情况下,你可以完全消除危险:

{ 
     SomeClass* someObject= ... 
     ... use someObject ... 
    [someObject release]; 
    } 
    ... more code ... 

这里我使用的是{...}块来限制变量的作用域。那么以后使用someObject只是一个编译时错误。

+0

我喜欢第三个选项。我不知道你可以这样做。但是,我从来没有见过。如果这是做到这一点的最佳方式,那我为什么不看它。我应该开始这样做吗?它是否使代码混乱? – ma11hew28 2010-09-25 13:01:04

+0

我阅读了您链接到的博客条目。他们给出的宏选项似乎是一个很好的解决方案。 – ma11hew28 2010-09-25 13:54:24

+0

是的,在方法中确定变量的范围可能是一个好主意,我也是这样做的。我倾向于懒惰,虽然因为我还没有被这个咬过。 – imaginaryboy 2010-09-25 16:50:25

特别是对于高德释放的情况下,在dealloc有争论的关于是否是更好的释放与否之后将它们设置为nil社会公平的金额。

一般来说,零难民营会让应用程序在解除分配后访问对象的不幸情况下,甚至在多线程应用程序期间崩溃。

反零营不认为上述参数是特别有用的,因为他们觉得应用程序应该在这种情况下崩溃,使它更明显,你的应用程序有缺陷(它正在访问一个释放目的)。

这并不一定是最全面的立场总结,但它给你一个涉及“争议”的想法。

KVO/KVC问题有些分离,因为这不是关于是否将ivar设置为零,而是因为可能的副作用问题使用属性的setter来安全使用(如KVO/KVC)。

+0

谢谢。这就说得通了。你对Yuji的第三种选择有什么看法? – ma11hew28 2010-09-25 13:02:53