二十九、理解引用计数
1、自动引用计数(Automatic Reference Counting,ARC)将内存管理事宜交由编译器处理。
2、过早释放对象可能导致悬挂指针,所以调用release后应清空指针。
3、设置方法内应先保留新值,再释放旧值,最后赋值。
4、autorelease可以保证对象在跨越方法调用边界后存活,在当前线程的下一次事件循环时释放。
三十、以ARC简化引用计数
1、ARC在调用内存管理方法时,并不通过Objective-C的消息派发机制,而是直接调用其底层C语言版本,且性能更好。
2、在编译期,ARC会把能够相互抵消的retain、release、autorelease操作约简。
3、ARC只负责管理Objective-C对象的内存。CoreFoundation对象不归ARC管理,开发者应适时调用CFRetain/CFRelease。
4、可以用__weak局部变量打破block所引入的保留环。
三十一、在dealloc方法中只释放引用并解除监听
1、ARC会通过自动生成的.cxx_destruct方法在dealloc中自动添加释放代码。
2、在dealloc中,应取消原来订阅的KVO或NSNotification等通知。
3、在dealloc中不要调用属性的存取方法。
4、在dealloc中不要执行异步操作。
应用
1、在dealloc中,不移除KVO和Notification不会影响dealloc的执行,但删除一个不存在的KVO会崩溃。
三十二、编写异常安全代码时留意内存管理问题
1、在Objective-C代码中,只有当应用程序必须因异常状况而终止时才应抛出异常。
2、如果手工管理引用计数,而且必须捕获异常,那么要设法保证代码能将对象正确释放。
2、默认情况下,ARC不生成安全处理异常所需的清理代码。可通过开启编译器标志-fobjc-arc-exceptions生成清理代码,不过会导致应用程序变大,而且会降低运行效率。
三十三、以弱引用避免保留环
1、保留环会导致内存泄露。
2、避免保留环的最佳方式是弱引用。
3、weak引用可以自动清空,是随着ARC而引入的运行期新特性。
三十四、以自动释放池块降低内存峰值
1、线程中默认都有自动释放池,每次执行事件循环时将其清空。
2、内存峰值(high-memory waterline)指应用程序在某个特定时段内的最大内存用量。
三十五、用僵尸对象调试内存管理问题
1、启用僵尸对象(Zombie Object)调试后,运行期系统会把即将回收的对象转化成特殊的僵尸对象,而不是真正的回收。
2、运行期系统修改对象的isa指针,令其指向僵尸类,僵尸类能响应所有的选择子,响应方式:打印包含消息内容及其接受者的消息,然后终止应用程序。