例如:在调用堆栈下面
在CFRunLoopRunSpecific调用堆栈展开停止,为什么它不会在main,甚至为空之前展开?
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x36398848 __kill + 8
1 FrogFinder 0x000b5034 0x69000 + 311348
2 CoreFoundation 0x3447e980 __handleUncaughtException + 68
3 libobjc.A.dylib 0x346ce2ca _objc_terminate + 122
4 libc++abi.dylib 0x338a33be _ZL19safe_handler_callerPFvvE + 70
5 libc++abi.dylib 0x338a344a std::terminate() + 14
6 libc++abi.dylib 0x338a481e __cxa_rethrow + 82
7 libobjc.A.dylib 0x346ce22e objc_exception_rethrow + 6
8 CoreFoundation 0x343d453e CFRunLoopRunSpecific + 398
9 CoreFoundation 0x343d439e CFRunLoopRunInMode + 98
10 GraphicsServices 0x30c58fc6 GSEventRunModal + 150
11 UIKit 0x3785573c UIApplicationMain + 1084
12 FrogFinder 0x0006a7e6 0x69000 + 6118
13 FrogFinder 0x0006a7a4 0x69000 + 6052
答案 0 :(得分:3)
但是你在这里复制的回溯确实一直都是主要的。你的问题到底是什么?如果你的问题是:“为什么异常不会一直到主?”然后答案是CFRunLoop安装了一个包罗万象的处理程序。我相信Objective-C和C ++例外。
答案 1 :(得分:1)
在@try/@catch/@finally
块中,在@finally
结束时重新抛出异常。这通常适用于Objective-C异常,因为它们将原始故障点捕获为内部状态。 C ++异常没有(因为可以抛出任何类型)。所以在这里,您正在使用@finally
内部CFRunLoopRunSpecific
内部代码来维护堆栈展开不变量,同时也不幸地丢失了原始上下文。
您可以通过观察在运行循环源或NSExceptions
中提升常规CFRunLoopPerformBlock
与C ++异常的行为来自行探索差异。