线程清理导致罕见崩溃(NSFinalizeThreadData)

时间:2014-04-14 14:48:13

标签: objective-c multithreading

我办公室的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*方法会导致接收方被新线程拥有?

0 个答案:

没有答案