Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在后台线程上取消分配视图:如何调试?_Objective C_Macos - Fatal编程技术网

Objective c 在后台线程上取消分配视图:如何调试?

Objective c 在后台线程上取消分配视图:如何调试?,objective-c,macos,Objective C,Macos,有时我的应用程序崩溃是因为一个视图在后台线程上被释放,但问题是我不知道它来自哪里 以下是崩溃日志: 2016-11-28 12:21:44.753913 iCompta[3993:326592] -[NSView _registerWithBackdropView] should not be called off of the main thread. Invocation was here:( 0 AppKit 0x00007ff

有时我的应用程序崩溃是因为一个视图在后台线程上被释放,但问题是我不知道它来自哪里

以下是崩溃日志:

2016-11-28 12:21:44.753913 iCompta[3993:326592] -[NSView _registerWithBackdropView] should not be called off of the main thread. Invocation was here:(
0   AppKit                              0x00007fff8f082779 -[NSView(NSInternal) _unregisterWithBackdropViewIfNeeded] + 404
1   AppKit                              0x00007fff8f0995b6 -[NSView(NSInternal) _recursivelyNoteBackdropViewChanged] + 54
2   AppKit                              0x00007fff8f099685 -[NSView(NSInternal) _recursivelyNoteBackdropViewChanged] + 261
3   AppKit                              0x00007fff8f099685 -[NSView(NSInternal) _recursivelyNoteBackdropViewChanged] + 261
4   AppKit                              0x00007fff8f099685 -[NSView(NSInternal) _recursivelyNoteBackdropViewChanged] + 261
5   AppKit                              0x00007fff8f159fdd -[NSTableView _removeBackgroundView] + 194
6   AppKit                              0x00007fff8f159f05 -[NSTableView viewWillMoveToSuperview:] + 65
7   AppKit                              0x00007fff8f03b4cc -[NSView _setSuperview:] + 695
8   AppKit                              0x00007fff8f1fddab -[NSTableView _setSuperview:] + 263
9   AppKit                              0x00007fff8f041205 -[NSView removeFromSuperview] + 447
10  AppKit                              0x00007fff8f3be133 -[NSOutlineView removeFromSuperview] + 56
11  AppKit                              0x00007fff8f1627ec -[NSView removeFromSuperviewWithoutNeedingDisplay] + 38
12  AppKit                              0x00007fff8f8d333e -[NSView _finalize] + 1008
13  AppKit                              0x00007fff8f04ece3 -[NSView dealloc] + 350
14  AppKit                              0x00007fff8f04eaf2 -[NSClipView dealloc] + 165
15  libobjc.A.dylib                     0x00007fffa5e47e8d _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 781
16  Foundation                          0x00007fff92fb3b9b -[_NSXPCConnectionExportedObjectTable releaseExportedObject:] + 350
17  libdispatch.dylib                   0x0000000100c5d74d _dispatch_call_block_and_release + 12
18  libdispatch.dylib                   0x0000000100c53fcc _dispatch_client_callout + 8
19  libdispatch.dylib                   0x0000000100c6bb0b _dispatch_queue_serial_drain + 205
20  libdispatch.dylib                   0x0000000100c5d4f1 _dispatch_queue_invoke + 1174
21  libdispatch.dylib                   0x0000000100c56247 _dispatch_root_queue_drain + 671
22  libdispatch.dylib                   0x0000000100c55f58 _dispatch_worker_thread3 + 114
23  libsystem_pthread.dylib             0x0000000100ccb8c2 _pthread_wqthread + 1299
24  libsystem_pthread.dylib             0x0000000100ccb39d start_wqthread + 13
)

崩溃线程的名称是NSFileCoordinate,因此它似乎与文件协调有关,但这对我帮助不大。有没有调试这个的想法?

经过多次调试,我终于解决了这个问题。在我的例子中,崩溃起源处的视图是文档窗口的一部分,在关闭文档时有时会发生崩溃

当您关闭文档并进行修改时,会启动异步保存,我发现有时候文档最终会在后台队列中释放,然后导致窗口及其内部的视图也在后台队列中释放


因此,我的解决方案是在文档的dealoc方法中保留对窗口根视图的强引用,并在1秒后在主队列上调度一个块以使该引用无效。通过这种方式,我可以确保在主线程上解除分配所有视图。

该视图是一个
NSOutlineView
,您是删除一个视图还是关闭包含一个视图的窗口?它是带绑定的大纲视图吗?覆盖该大纲视图的removeFromSuperview,并检查[NSThread isMainThread]是否返回false。可能是由另一个线程中的绑定触发的和更新。@Willeke Yes当它发生时,总是在关闭主文档窗口之后。我认为它与绑定无关,因为我的大纲视图正在使用数据源。您是否使用
NSXPCConnection