2016-11-28 7 views
1

ビューがバックグラウンドスレッドで割り当て解除されるためにアプリがクラッシュすることがありますが、問題はどこから来たのかわからないことがあります。ここでバックグラウンドスレッドに割り当て解除されたビュー:どのようにデバッグするのですか?

がクラッシュログである:それはコーディネートを提出するが、それは非常に私を助けていないようですので、関連

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です。これをデバッグする方法はありますか?

+0

ビューは 'NSOutlineView'ですが、1つを削除するのか、それとも1つのウィンドウを閉じますか?それはバインディングを持つアウトラインビューですか? – Willeke

+0

そのアウトラインビューのremoveFromSuperviewを上書きし、[NSThread isMainThread]がfalseを返すかどうかを確認します。他のスレッドのバインディングによってトリガーされた可能性があります。 – Stefanf

+0

@Willekeはい、メイン文書ウィンドウを閉じた後も常にそうです。 – Cyril

答えて

1

最後に、多くのデバッグの後に問題を解決することができました。私の場合、クラッシュの起点のビューはドキュメントのウィンドウの一部であり、ドキュメントを閉じるとクラッシュが発生することがあります。

文書を閉じて変更があると、非同期保存が開始され、文書が最終的にバックグラウンドキューにリリースされ、そのウィンドウがウィンドウに表示され、その内部のビューもその背景に解放されることがわかったキュー。

私の解決方法は、私のドキュメントのdeallocメソッドで私のウィンドウのルートビューを強く参照し、その参照を無効にするために1秒後にメインキューにブロックをディスパッチすることでした。このようにして、すべてのビューがメインスレッド上で割り当て解除されるようにします。

関連する問題