写高质量OC代码52建议总结:32.编写“异常安全代码”时留意内存管理问题

纯C没有异常,而C++和OC都支持异常。当前运行期系统中,C++与OC的异常相互兼容。
 异常只应在发生严重错误后抛出,虽说如此,有时仍然需要编写代码来捕获并处理异常。比如使用OC编码时,或者编码中用到了第三方程序库而此程序库所抛出的异常又不受你控制时,就需要捕获及处理异常了。
 在try块中,如果先保留了某个对象,然后在释放它之前抛出了异常,除非catch快能处理此问题,否则对象做占用的内存就会泄露。
 异常处理例程将自动销毁对象,手动管理引用计数时,销毁工作有些麻烦。
@try{
    EOCSomeClass *object = [[EOCSomeClass alloc] init];
    [object doSomethingThatMayThrow];
    [object release];
 }
 @catch (...) {
    NSLog(@"Whoops, there was an error.Oh well...");
 }
 如果[object doSomethingThatMayThrow];抛出了异常,[object release];就不会执行,那么object就泄露了。解决办法是用@finally块。
@try{
 EOCSomeClass *object = [[EOCSomeClass alloc] init];
 [object doSomethingThatMayThrow];
 }
 @catch (...) {
 NSLog(@"Whoops, there was an error.Oh well...");
 }
 @finally{
 [object release];
 }
 使用ARC捕获异常时,不能实现release方法。打开编译器的-fobjc-arc-exceptions标志。在发现大量异常捕获操作时,应考虑重构代码。
 
 总结:
 1.捕获异常时,一定要将try块内所创立的对象清理干净。
 2.默认情况下,ARC不会生成安全处理异常所需的清理代码。开启编译器标志后,可生成这种代码,会导致应用程序变大,运行效率降低
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值