Effective Objective-C 2.0笔记(五)内存管理

二十九、理解引用计数

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指针,令其指向僵尸类,僵尸类能响应所有的选择子,响应方式:打印包含消息内容及其接受者的消息,然后终止应用程序。

Effective Objective-C 2.0笔记(五)内存管理_第1张图片
Zombie Objects

三十六、不要使用retainCount

你可能感兴趣的:(Effective Objective-C 2.0笔记(五)内存管理)