• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
返回主页

左左木

  • 博客园
  • 首页
  • 新随笔
  • 联系
  • 订阅
  • 管理

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 @ 2016-08-22 09:59  左左木  阅读(260)  评论(0)    收藏  举报
刷新页面返回顶部

公告

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3