纯C没有异常,而C++和OC都支持异常。当前运行期系统中,C++与OC的异常相互兼容。
异常只应在发生严重错误后抛出,虽说如此,有时仍然需要编写代码来捕获并处理异常。比如使用OC编码时,或者编码中用到了第三方程序库而此程序库所抛出的异常又不受你控制时,就需要捕获及处理异常了。
在try块中,如果先保留了某个对象,然后在释放它之前抛出了异常,除非catch快能处理此问题,否则对象做占用的内存就会泄露。
异常处理例程将自动销毁对象,手动管理引用计数时,销毁工作有些麻烦。
总结:
1.捕获异常时,一定要将try块内所创立的对象清理干净。
2.默认情况下,ARC不会生成安全处理异常所需的清理代码。开启编译器标志后,可生成这种代码,会导致应用程序变大,运行效率降低
异常只应在发生严重错误后抛出,虽说如此,有时仍然需要编写代码来捕获并处理异常。比如使用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不会生成安全处理异常所需的清理代码。开启编译器标志后,可生成这种代码,会导致应用程序变大,运行效率降低