访问方法中的保留和释放:
最好的方法设置的原则是(保持新的释放旧的,谁拥有对象谁就负责释放对象)
- (void ) setEngine : (Engine *) newEngine
{
[newEngine retain] ;      
[engine release] ;        
engine = newEngine;
}请问,其中[newEngine retain] ;[engine release] ;  如何理解?

解决方案 »

  1.   

    查到了,呵呵.
    若你先release,「然后」才retain,你会把自己给解构(destruct,相对于建构)!这就是为什么应该要
     1) retain 2) release 3)设值的原因。那现在我们还需要release么,是对engine还是对newEngine进行release,或者两者效果是一样的呢 ?
      

  2.   

    这下完整了.-(void) setCity: (NSString*) c{
    [c retain];//---1
    [city release];//---2
    city=c;//---3
    }
    在JAVA 这种使用GC 机制的语言中,我们只需要写第三条语句。其实Object-C 中你也可以
    只写第三条语句,我们管这种方式获得的city 叫做弱引用,也就是city 只是通过赋值操作,
    把自己指向了c 指向的对象,但是对象本身的引用计数器没有任何变化,此时city 就要承担
    [c release]之后所带来的风险,不过有些情况下,你可能确实需要这种弱引用。这里你需要
    注意的是有些文档把这种弱引用叫做assign(指派,这很形象,把一个指针直接指派到另一
    个指针指向的对象,但不拥有这个对象)方式,强引用叫做retain 方式。
    当然,大多数情况下,我们使用的都是强引用,也就是使用第一行代码首先retain 一下,使
    引用计数器加1,再进行赋值操作,再进一步说就是先通过retain 方法拿到对象的拥有权,
    再安全的使用对象。
      

  3.   

    第二行代码又是为什么呢?其实这是为了防止city 可能已经指向了一个对象,如果不先对
    city 进行一次release,而直接把city 指向c 指向的对象,那么city 原来指向的对象可能会出
    现内存泄漏,因为city 在改变指向的时候,没有将原来指向的对象的引用计数器减1,违反
    了你retain 对象之后,要在恰当的时刻release 对象的要求。
    第三行代码毋庸置疑的要在最后一行出现,但按照前面的阐述,貌似第一行、第二行的代码
    是没有先后顺序的,也就是可以先[city release],再[c retain],但真的是这样吗?有一种较为
    少见的情况,那就是把自己作为参数赋给自己(这听起来很怪),也就是说参数c 和成员变
    city 是一个指针变量,那么此时如果你先调用[city release],就会导致对象的retainCount 归0,
    对象被dealloc 了,那么[c retain]就会报错,因为对象没有了。
    综上所述,上面所示的三行代码是比较好的组织方式。但其实你可能也会看到有些人用其他
    的方式书写setter 方法,这也没什么好奇怪的,只要保证对象正常的使用、回收就是没有问
    题的代码。
      

  4.   

    - (void) setMyField: (NSString*) newValue {   
        if (newValue !=myField) {  
            [myField release];  
            myField = [newValue retain];  
        }  
      

  5.   

    这个是@property (retain)的代码