新手提问,问个关于内存管理方面的问题 本帖最后由 z550946941 于 2012-12-27 17:20:52 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的问题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,但对对象的所有权仍表示的不清楚,依然会内存泄漏。 非常感谢您的回答,很详细,很容易理解。通过你的回答,那我是不是可以这样理解第一种情况:在第一种情况中的第二个setEngine执行后,其实这个时候 car 里面的 engine 同时指向了engine1和engine2,或者说是 engine1此时是处于游离状态,engine2被engine拥有了。还有就是还想请教一下,在iOS开发中,内存管理这块是手动处理好还是使用ARC好,或者说是根据项目的实际情况来决定。 也不知道该不该用ARC,怎么用 http://dev.10086.cn/cmdn/wiki/index.php?doc-view-3560.html http://shy818818.blog.163.com/blog/static/933983092011328111510158/ 想做一个应用图标隐藏的软件,像腾讯手机管家Pro里的软件隐藏 怎么自定义控件的外观? NSTextField是如何实现Undo Redo功能的 iphone如何调用外部程序打开一个pdf文件 iphone中如何获取磁盘的剩余空间大小 Voip后台实现过程中的问题,底层用sip的库,求支援求帮助求分析解决 关于实例变量声明的位置 ios8 reloaddata问题 iOS开发中人的心率是怎么计算出来的 iOS通过soap协议调用webservice接口时遇到问题,求指教!!! cocos2d-x CCScrollView的问题 CGSizeMake用法请教
如果你不对新来的值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,但对对象的所有权仍表示的不清楚,依然会内存泄漏。
在第一种情况中的第二个setEngine执行后,其实这个时候 car 里面的 engine 同时指向了engine1和engine2,或者说是 engine1此时是处于游离状态,engine2被engine拥有了。还有就是还想请教一下,在iOS开发中,内存管理这块是手动处理好还是使用ARC好,或者说是根据项目的实际情况来决定。