为什么在iPhone中使用three20中的TT_RELEASE_SAFELY?
#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
为什么three20认为可以安全地将ivar在发布后归零?忽略ivar = nil
步骤是不安全的吗?为什么在iPhone中使用three20中的TT_RELEASE_SAFELY?
我不认为我使用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
只是一个编译时错误。
特别是对于高德释放的情况下,在dealloc
有争论的关于是否是更好的释放与否之后将它们设置为nil
社会公平的金额。
一般来说,零难民营会让应用程序在解除分配后访问对象的不幸情况下,甚至在多线程应用程序期间崩溃。
反零营不认为上述参数是特别有用的,因为他们觉得应用程序应该在这种情况下崩溃,使它更明显,你的应用程序有缺陷(它正在访问一个释放目的)。
这并不一定是最全面的立场总结,但它给你一个涉及“争议”的想法。
KVO/KVC问题有些分离,因为这不是关于是否将ivar设置为零,而是因为可能的副作用问题使用属性的setter来安全使用(如KVO/KVC)。
谢谢。这就说得通了。你对Yuji的第三种选择有什么看法? – ma11hew28 2010-09-25 13:02:53
我喜欢第三个选项。我不知道你可以这样做。但是,我从来没有见过。如果这是做到这一点的最佳方式,那我为什么不看它。我应该开始这样做吗?它是否使代码混乱? – ma11hew28 2010-09-25 13:01:04
我阅读了您链接到的博客条目。他们给出的宏选项似乎是一个很好的解决方案。 – ma11hew28 2010-09-25 13:54:24
是的,在方法中确定变量的范围可能是一个好主意,我也是这样做的。我倾向于懒惰,虽然因为我还没有被这个咬过。 – imaginaryboy 2010-09-25 16:50:25