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

《Effective Objective-C 2.0》读书笔记

Posted by Japho on August 5, 2018

try块中,如果保留了某个对象,然后在释放之前抛出了异常,那么,除非catch块能够处理此问题,否则对象所占内存将泄露。

虽说默认情况下不开启,但是ARC依然能生成这种安全处理异常所用的附加代码。-fobjc-arc-exceptions这个编译器标志用来开启此功能。默认不开启是因为,Objective-C代码中,只有当应用程序必须因异常终止时才会跑出异常。如果应用终止,是否会发生内存泄露就无关紧要了。

如果手动管理引用计数,而且必须捕获异常,那么要设法保证所编写代码能把对象正确清理干净。若使用ARC而且必须捕获异常,则需要打开编译器的-fobjc-arc-exceptions标志。但是,重要的是,在发现大量异常捕获操作时,应该考虑重构代码,使用NSError错误信息传递法来取代异常。

要点:

  • 捕获异常时,一定要注意将try块内所创立的对象清理干净。
  • 在默认情况下,ARC不会生成安全处理异常所需的清理代码。开启编译器标志后,可生成这种代码,不过会导致应用程序变大,而且会降低运行效率。