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

2018-10-14  本文已影响0人  MrSYLong

Objective-C的错误模型表明,异常只应在发生严重错误后抛出,不过有时候仍然需要编写代码来捕获并处理异常。

使用手动计数时:

@try{
    EOCSomeClass *object = [[EOCSomeClass alloc] init];
    [object doSomethingThatMayThrow];
}
@catch(...){
    Nslog(@"There was an error!");
}

// 无论是否发生异常,@finally块中的代码都会执行
@finally{
    [object release];
}

使用@finally块可以在发生异常时也能释放对象。

ARC环境下,不能调用release,无法像手动管理那样将释放操作移到@finally块中。ARC又不会自动处理,这种情况下可以打开编译器的-fobjc-arc-exceptions标志来开启ARC生成安全处理异常所用的附加代码。只是这段代码会严重影响运行期的性能,即使不抛出异常。如果有大量异常捕获操作时,应考虑重构代码,用21条的NSError式错误信息传递法来取代异常。

在Objective-C代码中,只有当应用程序必须因异常情况而终止时才应抛出异常。因此,如果应用程序即将终止,是否发生内存泄漏已经无关紧要了,添加安全处理异常所用的附加代码也就没有意义。

上一篇 下一篇

猜你喜欢

热点阅读