我办公室的QA工程师遇到了一个崩溃,堆栈似乎很不寻常。在谷歌上查了NSFinalizeThreadData
并且只找到了5个结果,我想我会把这种经历带到世界各地,看看是否还有其他人看过类似的东西。
Thread 118 Crashed:: com.mycompany.mycontroller
0 libobjc.A.dylib 0x92eec4a7 objc_msgSend + 23
1 com.apple.AppKit 0x9a5d102f -[NSView removeFromSuperview] + 546
2 com.mycompany.myapplication 0x004d6536 -[MyController dealloc] + 105
3 libobjc.A.dylib 0x92f025ef -[NSObject release] + 47
4 com.apple.Foundation 0x902975e2 __NSFinalizeThreadData + 1468
5 com.apple.CoreFoundation 0x97dd0be2 __CFTSDFinalize + 82
6 libsystem_pthread.dylib 0x9b23a87d _pthread_tsd_cleanup + 190
7 libsystem_pthread.dylib 0x9b23727e _pthread_exit + 108
8 libsystem_pthread.dylib 0x9b2371e8 pthread_exit + 33
9 com.apple.Foundation 0x90297026 +[NSThread exit] + 18
10 com.apple.Foundation 0x90270e7e __NSThread__main__ + 1450
11 libsystem_pthread.dylib 0x9b2365fb _pthread_body + 144
12 libsystem_pthread.dylib 0x9b236485 _pthread_start + 130
13 libsystem_pthread.dylib 0x9b23bcf2 thread_start + 34
似乎这里关闭的线程以某种方式获得了MyController对象的所有权。也许这是因为以下原因:
-(void) startMyControllerThread
{
[self performSelectorInBackground:@selector(runLoop) withObject:nil];
}
我认为以这种方式执行选择器可能会给self的新线程所有权,然后在runLoop
超出范围时清除它?如果是这种情况,我需要确定从superview中删除的视图实际上不再是NSView
的原因。
是否有人能够了解NSFinalizeThreadData
并确认或否认performSelector*
方法会导致接收方被新线程拥有?