ios - 使用 -fobjc-arc-exceptions 编译的文件中的快速枚举异常安全吗?

标签 ios objective-c macos cocoa automatic-ref-counting

我正在考虑在我正在编写的库中使用异常进行内部错误处理。如果使用它们,则将在启用 arc 和 f-objc-arc-exceptions 的情况下构建库。

obj-c 异常的一个问题是必须注意不要抛出任何您不知道异常安全的代码。当使用-fobjc-arc-exceptions编译文件时,编译器异常添加的枚举代码安全吗?

据我所知,应该是这样,因为我看不出有任何理由让它做任何需要清理的事情。但如果这种行为被记录在某处,我会更高兴使用它。

编辑:我应该澄清一下,当我说“使用异常进行内部错误处理”时,我指的是非 fatal error 。所以这里的“异常安全”意味着不应该出现内存泄漏、不存在未释放的锁等情况。

最佳答案

不要将异常用于内部错误处理

最多,您最终会得到与系统代码具有不同设计和感觉的代码。两者之间的边界始终需要维护和考虑,因为它添加了“我在异常行为栅栏的哪一边?”

实际上,这将是一场维护噩梦。每次重构代码时(可能是为了利用系统中的新功能),您都必须不断地维护两种异常处理之间的边界。

更糟糕的是,软件更新会更改实现细节,您的应用程序将开始崩溃。

这些库被设计为不使用可恢复错误的异常。如果您想最大限度地降低代码的拥有成本,您的代码应该遵循相同的模式。

系统上有几个库在内部使用异常来处理可恢复的错误。它们是错误和维护难题的持续来源。

<小时/>

回答您的具体问题,不,这永远不安全:

@try {
    for ( id x in array ) { ... do something that might @throw ... }
} @finally {
    ...
}

当您@throw脱离快速枚举时,您正在抛出Apple代码框架,并且该行为被记录为未定义。在实践中,这样一个简单的模式可能会工作得很好,但“巧合工作”会产生巨大的维护成本。

关于ios - 使用 -fobjc-arc-exceptions 编译的文件中的快速枚举异常安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499100/

相关文章:

ios - UIView 及其 subview 上的 UITapGestureRecognizer 在 subview 被点击时一起响应

ios - 如何在 UITableViewCell 中设置 UIButton 状态?

ios - 从类型 '(_, _, _) throws -> ()' 的抛出函数到非抛出函数类型的无效转换 '(URLResponse?, Data?, Error?) -> Void

ios - 推送通知无法通过 TestFlight 在 iOS 10 上运行

objective-c - wifi 连接时的通知 (OS X)

macos - 初始化 ADB 时,Android Studio 在 Mac OS El Capitan 上随机崩溃

ios - 仅在其父 View 内拖动 UIImageView

ios - iOS 7 和 iOS 8 的人物选择器

ios - 需要有关 viewDidLayoutSubviews 的帮助

xcode - NSFilemanager fileExistsAtPath 总是失败