objective-c - 什么是alt handler,说说Objective-C运行时系统异常处理?

标签 objective-c exception-handling objective-c-runtime

查看 Objective-C 运行时系统源代码,尤其是在 objc-exception.mm 处文件中,我找到了表达式“alt handler”和处理 alt 处理程序的函数。我不知道它是什么,但根据文件注释,如果运行时库是在没有 alt 处理程序支持的情况下编译的,那么只有 zerocost 实现,我也不知道它是什么。

那么,当我们谈论 Objective-C 运行时库时,什么是 alt 处理程序以及什么是零成本异常处理?

最佳答案

Objective-C 运行时库允许开发人员在系统第二次展开堆栈时指定要为每个堆栈帧调用的函数,在清理阶段,在它找到刚刚抛出的 catch 子句之后异常。

因此,对于熟悉 Unwind 库和 ObjC 异常处理系统的人来说,当为当前堆栈帧的 Unwind Context 调用 Objective-C 个性例程 (__objc_personality_v0) 时, ObjC 系统检查是否有该上下文的 alt 处理程序。如果找到 alt 处理程序,则首先调用它。此后,由于 ObjC 异常处理机制使用 C++ ABI 展开堆栈,cxx 个性函数 (__gxx_personality_v0) 被调用。然而,只有在清理阶段而不是搜索阶段调用 objc 个性例程时才会这样做。因此,如果没有为当前异常找到 catch 子句,则不会调用 alt 处理程序(如果有的话)。

关于零成本部分,cxx个性函数使用零成本异常处理。因此,如果运行时库在没有 alt 处理程序支持的情况下编译,则只有零成本实现,因为 __gxx_personality_v0 无论如何都会被调用。

Objective-C 库公共(public) API 提供了两个函数来为特定的 Unwind 上下文添加和删除 alt 处理程序:分别是 objc_addExceptionHandlerobjc_removeExceptionHandler

关于objective-c - 什么是alt handler,说说Objective-C运行时系统异常处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15578025/

相关文章:

ios - 在 iOS 设备上读取 csv 文件时出错

iphone - 将焦点设置为 UITabBarItem

java - 异常处理反模式 : Why log and return null is an anti-pattern

objective-c - 为协议(protocol)方法键入编码字符串

ios - objc_setAssociatedObject 和 objc_getAssociatedObject 有什么问题吗?

ios - 如何从 Objective-C 中的文本文件解析 JSON 数据

ios - 我可以将 Objective C 中的泛型用于针对 iOS 8 的应用程序吗?

java - 什么时候在代码中捕获 RuntimeExceptions?

c# - 在 c# 6.0 中使用异常过滤(使用 typeof())VS。捕获自定义异常

ios - NSClassFromString 行为不当和缓存类