您好,匿名用户
随意问技术百科期待您的加入

关于iOS 非ARC转ARC的一些小问题self retain转成self 强引用怎么转

0 投票

上次的ios活动得到某高人指点 在外文网站中发现arc支持4.3 就把手头的工程转换成了ARC的 但是遇到了个问题,以前都是在asihttp发起是把self retain了的 然后在回调结束后把self release了 这样就不会溢出 也不会使的回调时 自己已经release导致 messge sent to deallocated instance 的错误 但是改成arc后不是release 和 retain都没了么 我要怎么解决self提早被release 导致的crash呢??有人回答过类似问题说要给self一个强引用 然后后面self给个nil 但是怎么给self强引用呢? setdelegate 算是强引用吗??等待高人介绍 初识ARC 还不太了解

用户头像 提问 2012年 12月1日 @ Shyvana 上等兵 (214 威望)
分享到:

1个回答

0 投票
 
最佳答案

我先说内存如何管理才是规范的:当你需要对象a被b强引用时,要确保b是不被释放的。而你之前的代码中a是request,b是栈,栈退出时栈释放了,却没有减少request的强引用数(没在栈上release),虽可能工作正常,却是一种不规矩的做法。无论c、c++还是objc,规矩的做法都是“确保强引用的责任人和释放的责任人”是一个,所谓解铃还需系铃人。

开了ARC后你还是可以理解成栈在强引用request,栈释放后request也被release。我建议之前运行完美的代码不改ARC也可以,编译选项加-fno-objc-arc。想改的话把强引用者改为对象,即在成员变量中声明ASIHTTPRequest *_request; 然后在栈空间使用成员变量。

楼主需要理解的不仅是ARC如何用,而是c中malloc、free如何用。知道malloc和free什么时候该用,就知道什么时候改retain或release。手动内存管理意识是java或其他弱类型语言转业者需要培养的。

若对象未声明weak,则默认strong。声明的位置就是retain的位置:在栈上声明Class a,栈就对a持有强引用;b的成员变量声明Class a,b就对a持有强引用。

祝楼主好运

用户头像 回复 2012年 12月1日 @ Nunu 上等兵 (350 威望)
选中 2012年 12月1日 @Shyvana
提一个问题:

相关问题

0 投票
1 回复 107 阅读
用户头像 提问 2012年 12月1日 @ Apple 上等兵 (542 威望)
0 投票
1 回复 39 阅读
用户头像 提问 2012年 12月1日 @ Artemis 上等兵 (162 威望)
0 投票
0 回复 19 阅读
用户头像 提问 2013年 9月10日 @ Draven 上等兵 (325 威望)
0 投票
1 回复 113 阅读
0 投票
1 回复 41 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...