我刚刚完成了一门iPhone应用程序编程课程.作为课程的一部分,我看到

  • Objective-C使用@try指令提供异常处理
  • 系统库不使用异常处理,首选return nil

我问我是否应该对我编写的新代码使用异常处理(例如,如果我同时编写前端代码和逻辑代码,那么它们之间的通信就在我手中),但我被告知不应该,人们不应该对新代码使用异常.(但他没有详细说明,然后全班继续上课,我想原因可能会在以后变得清楚.)

例外肯定比return nil好吗?您可以捕获特定类型,您不会因为忽略通常成功的函数的返回类型而试图忽略它们,您可以记录文本消息,它们允许您的代码关注正常情况,因此更具可读性.Why to use exceptions

那你觉得呢?我的培训师不使用Objective-C例外是否正确?如果是,为什么?

推荐答案

在没有自动管理资源的情况下抛出异常是不安全的.Cocoa框架(和邻居框架)就是这种情况,因为它们使用手动引用计数.

如果抛出异常,通过展开堆栈跳过的任何release个调用都将导致泄漏.这应该限制你只有在你确定你不会恢复的情况下才能恢复,因为当一个进程退出时,所有资源都会返回操作系统.

不幸的是,NSRunLoop往往会捕获传播到它们的所有异常,因此如果在某个事件期间抛出,则会继续到下一个事件.这显然非常糟糕.因此,最好不要扔.

如果使用垃圾收集的Objective-C,这个问题就会减少,因为Objective-C对象表示的任何资源都将被正确释放.然而,没有包装在Objective-C对象中的C资源(例如文件描述符或malloc个分配内存)仍然会泄漏.

所以,总而言之,不要扔.

正如您所提到的,Cocoa API对此有几种变通方法.返回nilNSError**模式是其中的两种.

ARC的澄清

ARC用户可以 Select 启用或禁用完全异常安全.启用异常安全时,ARC将生成代码,在强引用的作用域被终止时释放强引用,从而使使用exception in your code变得安全.ARC不会修补外部库以在其中启用异常支持,因此即使程序中启用了异常支持,也应该小心抛出(尤其是捕获)的位置.

ARC异常支持可以使用-fobjc-arc-exceptions启用,也可以使用-fno-objc-arc-exceptions禁用.默认情况下,它在Objective-C中禁用,但在Objective-C++中启用.

默认情况下,Objective-C中的完全异常安全是禁用的,因为Clang作者认为Objective-C程序无论如何都不会从异常中恢复,并且因为清理会带来较大的代码大小成本和较小的性能损失.另一方面,在ObjtoVC++中,C++已经引入了大量的清理代码,人们更可能实际上需要异常安全.

这都是ARC specification on the LLVM website美元的.

Objective-c相关问答推荐

Objective C:给定一个Class id,我可以判断这个类是否实现了某个协议吗?还是有一定的 Select 器?

UISearchDisplayController 没有结果tableView?

获取 Objective-C 类或实例的所有方法

在Objective C中迭代枚举?

NSMutableDictionary 线程安全

如何在另一个视图中获取视图的框架?

在 iOS 和 Mac OS X 应用程序中使用 C++

iOS 在设备旋转时更改自动布局约束

xcode storyboard Container View - 如何访问视图控制器

arc4random 和 arc4random_uniform 有什么区别?

在 Objective C 中使用 extern

使用 OpenCV 在 iOS 中进行透视变换 + 裁剪

将块存储在数组中

如何将 NSNumber 转换和比较为 BOOL?

Cocoa 与 Cocoa Touch - 有什么区别?

如何在 Objective-C 中将 NSString 解析为 BOOL?

在 UICollectionView 上重置滚动

通过情节提要加载时如何初始化视图?

如何判断 NSString 的最后一个字符

在 iOS 8 中使用 NSMutableAttributedString 的字符串的下划线部分不起作用