在使用-fobjc-arc-exceptions编译的文件中,快速枚举是否安全异常?

Chr*_*eux 1 macos cocoa objective-c ios automatic-ref-counting

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

obj-c异常的一个问题是必须注意不要抛弃任何你不知道的异常安全的代码.编译文件时-fobjc-arc-exceptions,编译器异常添加的枚举代码是否安全?

据我所知,它应该是,因为我看不出有什么理由去做任何需要清理的事情.但如果在某处记录这种行为,我会更乐意使用它.

编辑:我应该澄清,当我说"使用异常进行内部错误处理"时,我说的是非致命错误.所以"异常安全"在这里意味着不应该有内存泄漏,没有未释放的锁等.

bbu*_*bum 7

不要使用异常进行内部错误处理.

充其量,您最终会得到的代码与系统代码具有不同的设计和感觉.两者之间的边界总是需要维护和考虑,因为它增加了"我在哪个异常行为栏的哪一侧?"

实际上,这将是一场维护噩梦.每次重构代码时 - 可能利用系统中的新功能 - 您将不断地保持两种异常处理之间的边界.

更糟糕的是,会有一个更新实施细节的软件更新,您的应用程序将开始崩溃.

这些库旨在不使用可恢复错误的异常.如果要最小化该代码的所有权成本,则代码应遵循相同的模式.

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


要回答您的具体问题,不,这绝不是安全的:

@try {
    for ( id x in array ) { ... do something that might @throw ... }
} @finally {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当您@throw没有快速枚举时,您正在抛出一段Apple代码,并且行为被记录为未定义.在实践中,这种简单的模式可能会很好地工作,但"巧合工作"具有显着的维护成本.