各位好,我刚学iphone,关于内存管理,看了一篇文章http://lichen1985.com/blog/?p=268里面说下面两种情况,会导致对象引用计数+1,后面需要release。
1. 创建一个对象。包括使用任何名称中包含“alloc”、“new”、或者“copy”的方法。
2. 保留(retain)一个对象。在调用release后,对象就被释放了。然后我在工程的delegate里看到:
MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@”HelloWorld” bundle:[NSBundle mainBundle]];
self.myViewController = aViewController;
[aViewController release];self.myViewController = aViewController;这句话并不会导致引用计数+1,如果要+1,需要调用retain。那对于后面的release,是不是aViewController就里面被释放了呢?那self.myViewController岂不是就无效了么?请各位大侠指点,谢谢!

解决方案 »

  1.   

    我明白了,是因为myViewController的属性retain
    retain,setter方法对参数进行release旧值再retain新值。这里所有权已经改变了
      

  2.   

    个人理解:    a viewcontroller  的地址给了myViewController  释放a    ,  myViewController还能 记得 上次a的地址 ,尽管不能通过 a 来访问,但是可以通过myViewController访问到
      

  3.   


    我觉得主要还是因为myViewController的属性中有retain,如果没有myViewController=aViewController这句话,在[aViewController release];后,就已经被释放了,谁也用不了它了。
    但是因为retain,在给myViewController赋值之后,引用计数应该是2了,后面的release又使引用计数变为1,这样这个对象就不会被释放了。最后在dealloc里面调用[myViewController release];来释放对象。
      

  4.   

    不是的哦就是两个 指针。都分配了内存。   myViewController=aViewController你可以 使用  nslog(@"%i",[myViewController retaincount]);
               nslog(@"%i",[aViewController retaincount]); 来查看,他的retainCount是不是有2这个东东其实他们都是一次,在没有 release之前都是1。没有2只是一个简单的地址赋值你用指针来理解就OK啦。           
      

  5.   

    property中声明了retain,所以self.变量 = 某变量,就会自动retain,self.变量,这里的.其实是一个方法,会调用自动生成的set方法,而set方法中会有类似:
    - (void) setMyField: (NSString*) newValue { 
        if (newValue !=myField) {
            [myField release];
            myField = [newValue retain];
        }
    }
    这样的操作,所以会自动retain的,[aViewController release];后其实他的引用计数还会是1,而不是0,再一个一个对象释放不是release是释放,而是引用计数为0后,会自动调用dealloc方法,其实release只是引用计数减一
    如果还是不太清楚,可以看看
    http://blog.csdn.net/volcan1987/article/details/6721828
    http://blog.csdn.net/volcan1987/article/details/6664975
      

  6.   

    自己随时检查下retainCount就清楚了。 
    空说没有意义。
      

  7.   

    一定要清楚,引用计数要达到的效果你才能理解这种代码编写的方式,引用计数是要达到各个层次负责各层的内存问题,如果你需要,那么引用计数加1,用完释放即可。
    不要关心太多的细节,不像C++那样,你得考虑你申请的内存到什么时候释放,该不该再申请的问题。MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@”HelloWorld” bundle:[NSBundle mainBundle]];
    self.myViewController = aViewController;
    [aViewController release];首先生成了一个视图控制器,接着把它传给了本类对象,接着任务完成,你释放就行了。
    至于刚刚生成的视图控制器,本类对象会正确的处理即可。