32、编写“异常安全代码”时留意内存管理问题

​ 虽然OC只有在发生严重错误导致程序无法继续运行时,才应跑出异常;但如果使用OC++编码或使用了第三方库抛出的异常不受控制时,就需要捕获及处理异常了。

​ 有些系统库也会抛出异常,如:使用KVO时,若注销一个尚未注册的“观察者”,则会抛出异常;

​ 发生异常时应如何管理内存又是个值得研究的问题。在try块中,如果先保留了某个对象,然后在释放它之前又抛出了异常,此时除非catch块能释放对象,否则就会导致内存泄露。

​ ARC模式下,不会在finally块里加代码处理内存泄露问题,因为者需要添加大量的样板代码,会严重影响运行期的性能,即便在不抛异常时也如此。(而且添加的额外代码还会明显增加应用程序的大小。这些副作用都不甚理想)虽说默认不会添加,但可以通过-fobjc-arc-exceptions这个编译器标志来开启此功能。并且处于OC++模式时编译器会自动把-fobjc-are-exceptions标志打开。

Last updated

Was this helpful?