32、编写“异常安全代码”时留意内存管理问题
虽然OC只有在发生严重错误导致程序无法继续运行时,才应跑出异常;但如果使用OC++编码或使用了第三方库抛出的异常不受控制时,就需要捕获及处理异常了。
有些系统库也会抛出异常,如:使用KVO时,若注销一个尚未注册的“观察者”,则会抛出异常;
发生异常时应如何管理内存又是个值得研究的问题。在try块中,如果先保留了某个对象,然后在释放它之前又抛出了异常,此时除非catch块能释放对象,否则就会导致内存泄露。
ARC模式下,不会在finally块里加代码处理内存泄露问题,因为者需要添加大量的样板代码,会严重影响运行期的性能,即便在不抛异常时也如此。(而且添加的额外代码还会明显增加应用程序的大小。这些副作用都不甚理想)虽说默认不会添加,但可以通过-fobjc-arc-exceptions这个编译器标志来开启此功能。并且处于OC++模式时编译器会自动把-fobjc-are-exceptions标志打开。
Last updated
Was this helpful?