为什么在iPhone3中使用TT_RELEASE_SAFELY?

ma1*_*w28 1 iphone objective-c key-value-observing key-value-coding three20

#define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
Run Code Online (Sandbox Code Playgroud)

为什么three20认为释放后将ivar指定为nil是安全的?省略这ivar = nil一步是不安全的吗?

这就是我发现的全部内容:http: //github.com/facebook/three20/commit/1b946f475fb28d60e0aafc9ef394050c642c3a5b#commitcomment-115517

我不认为我在使用KVO/KVC,但我不确定.我现在正在读它.

谢谢!

马特

Yuj*_*uji 6

在里面-dealloc,这个问题拆分了Objective-C大师.阅读最近的博客文章,例如.

在其他方法的实现中,我个人的意见是,您不应该在首次发布后将变量保留在范围内.这段代码

   SomeClass* someObject= ...
   ... use someObject ...
   [someObject release]; 
   ... more code ...
Run Code Online (Sandbox Code Playgroud)

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

   SomeClass* someObject= ...
   ... use someObject ...
   [someObject release];
   someObject=nil; 
   ... more code ...
Run Code Online (Sandbox Code Playgroud)

会更好,因为消息传递nil是无害的.但是,在这种情况下,您可以完全消除危险:

   {
      SomeClass* someObject= ...
      ... use someObject ...
     [someObject release]; 
   }
   ... more code ...
Run Code Online (Sandbox Code Playgroud)

这里我使用一个{...}块来限制变量的范围.然后使用someObject稍后只是一个编译时错误.