本帖最后由 z550946941 于 2012-12-27 17:20:52 编辑

解决方案 »

  1.   

    你的问题1:
    如果你不对新来的值retain,那么你只是简单的引用它而没有拥有权,这是弱引用;这样会出现什么情况呢?就是当你的newEngine释放的时候,你的engine也就没了。那么就会出现EXC_BAD_ACCESS;你的问题2:
    @1  engine = newEngine; 弱引用

    @2  engine = [newEngine retain]; 强引用@1只是简单地指向newEngine,并没有newEngine的拥有权,当newEngine释放掉后,engine同时也被释放了
    @2是强引用,当newEngine retain后,newEngine的引用计数+1,可以这么讲,newEngine有一根线连到了XX这块内存区域,而engine也有一根线连到了XX这块内存区域,当[newEngine release]之后,只是把newEngine到XX的线给断了,而engine这根没断,所以 engine可以继续使用。你的还有一个问题的就是:
    使用的ARC不是说就是内存管理交给了系统。在使用ARC的环境下,你必须明确的表示出当前这个变量的拥有权,要使用__autoreleasing
    __strong
    __unsafe_unretained
    __weak
    这些来表明当前对对象的拥有权。而且像Core Foundation这种库也不参与ARC,你还是必须使用CFRelease()等这些方法来释放你的CF Object。
    综上所述,如果你使用ARC,但对对象的所有权仍表示的不清楚,依然会内存泄漏。
      

  2.   

    非常感谢您的回答,很详细,很容易理解。通过你的回答,那我是不是可以这样理解第一种情况:
    在第一种情况中的第二个setEngine执行后,其实这个时候 car 里面的 engine 同时指向了engine1和engine2,或者说是 engine1此时是处于游离状态,engine2被engine拥有了。还有就是还想请教一下,在iOS开发中,内存管理这块是手动处理好还是使用ARC好,或者说是根据项目的实际情况来决定。
      

  3.   

    也不知道该不该用ARC,怎么用
      

  4.   

    http://dev.10086.cn/cmdn/wiki/index.php?doc-view-3560.html
      

  5.   

    http://shy818818.blog.163.com/blog/static/933983092011328111510158/