[ios]iOS开发之self.abc = nil与[_abc release]的区别【转】

前者使用property的点操作符,也就相当于调用了abc对应的set method,和这句是一样的:[self setAbc:nil];

而后者没有通过property,直接访问了成员变量,调用了它的release方法。

对于set method来说,用synthesize来让系统帮我们生成的set方法和如下的类似:

- (void)setAbc:(id)newAbc
{
      if(_abc != newAbc){
           [_abc release];
           _abc = [newAbc retain]; //是retain还是copy取决于你property声明时的attributes  
       }
}
如果新值和成员相等,就不需要进行重复的赋值了,不等的话,需要把新值赋给成员,同时,成员_abc原来的内容就不需要了,这里要先调用release进行释放。(这个具体的原因在那本讲Objective-C的书中写的很清楚,请查看)。
因此在这里,调用self.abc = nil;
就等于掉了[_abc release];  和_abc = nil;

self.abc = nil;和[_abc release]; 都不一定释放对象,因为该对象还可能被别的引用,这里的操作的意图就是:别的地方用没用_abc我不知道,在这里的_abc我不用了。

在用retain或者copy的property attributes的时候,self.abc = nil;等于如下语句:
if(_abc!= nil)
{
   [_abc release];
   _abc = nil; //message sent to nil returns nil.
}
所以用起来更简单一点。

posted @ 2013-04-16 12:11  金建彤  阅读(284)  评论(0编辑  收藏  举报