黑马程序员技术交流社区

标题: dealloc在函数内部的retain release [打印本页]

作者: 胥鹏飞    时间: 2015-8-24 23:33
标题: dealloc在函数内部的retain release
-(void)setDog:(Dog *)dog{
                     if (_dog != dog ){
                                [_dog release];
                                    _dog =  [dog retain];
                                              }
                                     }




谁给我解释下?
作者: 张中付    时间: 2015-8-25 08:36
因为_dog 跟传进来的形参不是同一对象所以要先把以前的release ,在重新赋值
作者: 你是我的小苹果    时间: 2015-8-25 08:46
你这个代码少了一行。正确的应该是:

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

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


作者: 毛强    时间: 2015-8-25 09:02
你是我的小苹果 发表于 2015-8-25 08:46
你这个代码少了一行。正确的应该是:

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

_dog =  [dog retain];是先将retainCount+1,然后_dog = dog吗?如果是,后面那句话就重复了
作者: 你是我的小苹果    时间: 2015-8-25 10:19
后面那句是当if不成立的时候,这么会是重复呢?
作者: 胥鹏飞    时间: 2015-9-5 15:49
可是 为什么会有_dog !=dog  呢???还是不太懂
作者: 胥鹏飞    时间: 2015-9-15 21:57
张中付 发表于 2015-8-25 08:36
因为_dog 跟传进来的形参不是同一对象所以要先把以前的release ,在重新赋值

可以再详细点吗
作者: chensc    时间: 2015-9-16 06:08
学习学习!
作者: tangbinbin    时间: 2015-9-16 18:52
2楼解释的很好,比较详细了,,,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2