A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胥鹏飞 中级黑马   /  2015-8-24 23:33  /  1340 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

-(void)setDog:(Dog *)dog{
                     if (_dog != dog ){
                                [_dog release];
                                    _dog =  [dog retain];
                                              }
                                     }




谁给我解释下?

9 个回复

倒序浏览
因为_dog 跟传进来的形参不是同一对象所以要先把以前的release ,在重新赋值
回复 使用道具 举报
你这个代码少了一行。正确的应该是:

-(void)setDog:(Dog *)dog{
                     if (_dog != dog ){
                                [_dog release];
                                    _dog =  [dog retain];
                                              }
                               _dog = dog;
                                     }

先判断传进来的值是否与原来的值一样,如果不一样,先释放掉原来的值,再把新值赋值给它,如果一样,直接赋值。

回复 使用道具 举报
你是我的小苹果 发表于 2015-8-25 08:46
你这个代码少了一行。正确的应该是:

-(void)setDog:(Dog *)dog{

_dog =  [dog retain];是先将retainCount+1,然后_dog = dog吗?如果是,后面那句话就重复了
回复 使用道具 举报
后面那句是当if不成立的时候,这么会是重复呢?
回复 使用道具 举报
可是 为什么会有_dog !=dog  呢???还是不太懂

点评

如果传进来的形参还是原来的值,然后你release以后下面就会造成僵尸对象了,只有_dog!=dog传进来的不是原来的值的时候,你才要release旧值,retain新值...  发表于 2015-9-5 18:32
回复 使用道具 举报
张中付 发表于 2015-8-25 08:36
因为_dog 跟传进来的形参不是同一对象所以要先把以前的release ,在重新赋值

可以再详细点吗
回复 使用道具 举报
chensc 金牌黑马 2015-9-16 06:08:26
8#
学习学习!
回复 使用道具 举报
2楼解释的很好,比较详细了,,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马