1

我在http://opensource.apple.com/source/objc4/objc4-532.2/runtime/objc-exception.mm看到Apple的Objective-C運行時使用一些C++ ABI函數進行異常處理,如__cxa_throw,__cxa_begin_catch,__cxa_end_catch__cxa_rethrow。由於Objective-C中的異常處理類似於C++中的異常處理(即使C++個性化例程與Obj-C相同),只需要進行一些改動就可以在Objective-C運行時庫中使用這些函數。因此,我的觀點是,運行時團隊「不需要」或「不能」(可能爲了保持Objective-C++與C++的兼容性)實現它自己的ABI(通過使用Unwind庫,例如,像C++ ABI一樣)?不喜歡objc_exception_throwobjc_exception_rethrowobjc_begin_catchobjc_end_catch職能必須處理C++對象,讓他們不僅可以,但必須使用__cxa_throw__cxa_rethrow__cxa_begin_catch__cxa_end_catch引擎蓋下,像他們實際上做?爲什麼Objective-C運行時庫使用C++ ABI進行異常處理?

回答

3

我懷疑Apple選擇使用這些C++ ABI函數來提高C++和Objective-C異常之間的互操作性。 IIRC,在「現代」Objective-C運行時(可用於iOS和Mac OS X 64位)中,C++可以捕獲Objective-C異常,反之亦然。在運行時的早期版本中,情況並非如此,當在同一應用程序中組合C++和Objective-C代碼時,這導致了非常惱人的問題。

+2

正確;現代運行時具有統一的異常模型,因爲現代運行時沒有二進制兼容性要求,因此,運行時團隊可以在維持二進制兼容性(這也包括非易碎的ivars)的同時進行不可能的架構更改。 – bbum

相關問題