我在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_throw
,objc_exception_rethrow
,objc_begin_catch
和objc_end_catch
職能必須處理C++對象,讓他們不僅可以,但必須使用__cxa_throw
,__cxa_rethrow
,__cxa_begin_catch
和__cxa_end_catch
引擎蓋下,像他們實際上做?爲什麼Objective-C運行時庫使用C++ ABI進行異常處理?
1
A
回答
3
我懷疑Apple選擇使用這些C++ ABI函數來提高C++和Objective-C異常之間的互操作性。 IIRC,在「現代」Objective-C運行時(可用於iOS和Mac OS X 64位)中,C++可以捕獲Objective-C異常,反之亦然。在運行時的早期版本中,情況並非如此,當在同一應用程序中組合C++和Objective-C代碼時,這導致了非常惱人的問題。
相關問題
- 1. 當其他動態庫發生異常時,什麼是ABI/C++運行庫?
- 2. 爲什麼使用IntPtr進行處理?
- 3. 使用TestNG進行異常處理
- 4. 使用DB express進行異常處理
- 5. 使用「$」進行ANTLR異常處理,Java
- 6. 使用註解進行異常處理?
- 7. 行爲異常處理用C
- 8. 爲什麼運行時異常是未經檢查的異常?
- 9. 如何在C#中使用DLL進行全局異常處理?
- 10. C#運行時異常
- 11. 如何在使用Java進行編程時處理異常?
- 12. 如何使用JUnit進行單元測試時處理異常?
- 13. 如何在R運行時處理異常? (R.net與c#)
- 14. 在C#數組運行時的異常處理#
- 15. 爲什麼caret :: predict()僅使用XGBtree進行並行處理?
- 16. C#類庫異常處理
- 17. 純C異常處理庫
- 18. 什麼是alt處理程序,討論Objective-C運行時系統異常處理?
- 19. 處理:爲什麼setup()運行多次?
- 20. 什麼處理庫用來創建同時運行的渲染
- 21. java ScheduledExecutorService可運行的異常處理
- 22. 異常處理:什麼異常提出
- 23. 異常處理中這種奇怪的行爲是什麼?
- 24. 異常處理的內部行爲是什麼?
- 25. C#DLL運行時錯誤 - 建立,運行但試圖使用DLL函數時拋出未處理的異常
- 26. Grails運行時異常:無法打開Hibernate會話進行事務處理
- 27. 任務並行庫異常處理
- 28. 什麼是處理異常
- 29. 處理某些運行時HTTP異常的良好做法是什麼?
- 30. 爲什麼異常處理不能處理異步事件?
正確;現代運行時具有統一的異常模型,因爲現代運行時沒有二進制兼容性要求,因此,運行時團隊可以在維持二進制兼容性(這也包括非易碎的ivars)的同時進行不可能的架構更改。 – bbum