1

我在http://opensource.apple.com/source/objc4/objc4-532.2/runtime/objc-exception.mm看到 Apple 的 Objective-C 运行时使用一些 C++ ABI 函数进行异常处理,例如__cxa_throw__cxa_begin_catch和. 因为 Objective-C 中的异常处理类似于 C++ 中的异常处理(甚至 C++ 个性例程对于 Obj-C 也是相同的),所以只需要进行一些调整即可在 Objective-C 运行时库中使用这些函数。__cxa_end_catch__cxa_rethrow

所以,我的观点是,运行时团队“不需要”或者它“不能”(也许是为了保持与 C++ 的兼容性,对于 Objective-C++)实现自己的 ABI(例如,通过使用 Unwind 库,就像 C++ ABI 一样)? 像objc_exception_throw,objc_exception_rethrowobjc_begin_catch之类的函数objc_end_catch是否必须处理 C++ 对象,以便它们不仅可以,而且必须在底层使用,__cxa_throw和,就像它们实际做的那样?__cxa_rethrow__cxa_begin_catch__cxa_end_catch

4

1 回答 1

3

我怀疑 Apple 选择使用那些 C++ ABI 函数是为了增加 C++ 和 Objective-C 异常之间的互操作性。IIRC,在“现代”Objective-C 运行时(适用于 iOS 和 Mac OS X 64 位)中,C++ 可以捕获 Objective-C 异常,反之亦然。在运行时的早期版本中并非如此,当在同一个应用程序中组合 C++ 和 Objective-C 代码时,这会导致非常烦人的问题。

于 2013-02-06T04:12:30.300 回答