前者使用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. } 所以用起来更简单一点。