我们有一个严重的崩溃错误,我们绝对无法控制。问题是它恰好在后台异步发生,显然是在调度系统清理工作线程时。以下是两个示例堆栈跟踪:
Thread 7 Crashed:
0 libobjc.A.dylib 0x3b23b5b0 objc_msgSend + 15
1 Foundation 0x33c03581 -[NSNotificationCenter postNotificationName:object:userInfo:] + 49
2 Foundation 0x33cb3367 __NSFinalizeThreadData + 255
3 CoreFoundation 0x3336cf81 __CFTSDFinalize + 65
4 libsystem_c.dylib 0x3b68a12b _pthread_tsd_cleanup + 174
5 libsystem_c.dylib 0x3b689e03 _pthread_exit + 119
6 libsystem_c.dylib 0x3b68cd02 _pthread_workq_return + 26
7 libsystem_c.dylib 0x3b68ca16 _pthread_wqthread + 366
和:
Thread 8 Crashed:
0 Foundation 0x31bfd2e2 __NSFinalizeThreadData + 122
1 CoreFoundation 0x312b6f81 __CFTSDFinalize + 65
2 libsystem_c.dylib 0x395d412b _pthread_tsd_cleanup + 174
3 libsystem_c.dylib 0x395d3e03 _pthread_exit + 119
4 libsystem_c.dylib 0x395d6d02 _pthread_workq_return + 26
5 libsystem_c.dylib 0x395d6a16 _pthread_wqthread + 366
所有这些崩溃报告似乎都有相同的原因:
Exception Type: SIGSEGV
Exception Codes: SEGV_ACCERR at 0x9209ea83
我得到了这一点:似乎有一个NSThreadWillExitNotification
被张贴。崩溃日志在没有NSNotificationCenter
框架的情况下更频繁地出现(第二个示例)。常规调用只是传递@"NSThreadWillExitNotification"
对象NSThread
userInfo nil
。
我现在能想到的所有问题都是 NSThread 对象以某种方式被过度释放。我刚刚检查过,我们对 NSThread 的所有使用都是与主线程的简单等价检查。像这样:
if (NSThread.currentThread == NSThread.mainThread) ...
有什么见解吗?只是另一个奇怪的ARC问题?
谢谢大家,
麦克斯