新手提问,问个关于内存管理方面的问题 本帖最后由 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/ 在电脑上,怎么用C++调用iTunesMobileDevice.dll连机iPhone? 每个section中返回不同的行,请教指点 tableview视图不能上下滚动式什么情况?求指导 如何将untitled.plist中的信息放到tablevie中呢?? swift学习资源汇总 NavigationController的返回按钮 IOS统一标题栏的右侧按钮 iOS 中怎么修改 UIImageView的frame? iOS 项目添加watchkit 编译报错 请教投射功能 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好,或者说是根据项目的实际情况来决定。