ARC的原理是在编译时,由编译器在代码中自动插入retain、release、autorelease等代码来管理对象的引用计数。在程序运行时,系统会根据对象的引用情况来自动添加或删除retain、release等代码,从而自动管理对象的内存。
ARC情况下仍然可能存在内存泄漏。导致内存泄漏的主要原因是循环引用。
以下是比较容易产生循环引用的三个场景:
(1) delegate属性没有用weak修饰
(2) block中使用了self指针或者直接访问了成员变量,同时当前类有对block的强引用
(3) 当前类启动了NSTimer,但试图在当前类的dealloc方法中停止timer(如果timer未停掉,当前类由于被timer持有,dealloc方法根本不会被调用)。
ARC大大降低了iOS管理内存的难度,带来的副作用是安装包可能比MRC有所增加,增加幅度通常在10%左右。当然,相较于其对应用稳定性的帮助,这点损失似乎不算什么。在多数场景下,使用ARC显然是一个更优的选择。