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

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

上次的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 还不太了解


我先说内存如何管理才是规范的:当你需要对象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持有强引用。

祝楼主好运

【热门文章】
【热门文章】