Objective-C 异常

标签 objective-c exception-handling nserror

我刚刚完成了一个 iPhone 应用程序编程类(class)。作为类(class)的一部分,我看到了

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

我问我是否应该对我编写的新代码使用异常处理(例如,如果我同时编写前端和逻辑代码,那么它们之间的通信就在我手中)但我被告知不,不应该使用新代码的异常(exception)。 (但他没有详细说明,然后类(class)继续进行,我想也许稍后会明白原因..)

异常肯定优于return nil?您可以捕获特定类型,您不会试图通过忽略通常成功的函数的返回类型来忽略它们,您有可以记录的文本消息,它们允许您的代码专注于正常情况,因此更具可读性。 Why to use exceptions .

那你怎么看?我的培训师有权不使用 Objective-C 异常吗?如果有,为什么?

最佳答案

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

如果您抛出异常,您通过展开堆栈跳过的任何 release 调用都将导致泄漏。仅当您确定不会恢复时,这应该会限制您 throw ,因为当进程退出时所有资源都会返回给操作系统。

不幸的是,NSRunLoop 倾向于捕获传播给它们的所有异常,因此如果您在事件期间抛出异常,您将继续到下一个事件。这显然是非常糟糕的。因此,最好不要扔。

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

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

正如您所提到的,Cocoa API 有几个解决方法。返回 nilNSError** 模式就是其中的两个。

关于 ARC 的说明

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

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

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

全部来自ARC specification on the LLVM website .

关于Objective-C 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4648952/

相关文章:

objective-c - Objective-C : NSError in initialiser

cocoa-touch - iOS 中 NSErrorRecoveryAttempting、NSError 和 UIAlertView 的正确用法是什么?

objective-c - NSArrayController 更改不会传播到绑定(bind)的 NSUserDefaults

php - PHP 中的异常...为什么没有人使用它们?

c# - 全局异常过滤器或 Application_Error 都没有捕获未处理的异常

java - 如果将非法参数传递给 API 方法,何时抛出异常?

objective-c - 尝试为NSError设置本地化描述时代码崩溃

ios - 推送问题 UINavigationController

iphone - UITabbarController + ABPeoplePickerNavigationController 无法正常工作

ios - 如何在 iOS 中为多个动态按钮和标签设置自动布局?