私は特定のUIアクションの後にプログラムがクラッシュするメモリ破損エラー(私は疑いがあります)があります。これはCocoa Objective-Cアプリケーションであり、GCは使用しません。複数のスレッドからrunModalForWindowを使用するのは危険ですか?
デバッグの多くの時間後、私はクラッシュの可能な理由を見つけました:
DiscSelectPopup *popupSelect = [[DiscSelectPopup alloc] initWithDataList:dataList count:count];
NSInteger result = [NSApp runModalForWindow:popupSelect.window];
上記のポップアップルーチンがセカンダリスレッドから実行されます。このスレッドは、ユーザーがボタンをクリックするたびに作成され、開始されます。したがって、複数のモーダルポップアップを同時に表示させることができます。
私はMallocStackLogging=1
とMallocStackLoggingNoCompact=1
でデバッグモードでプログラムを実行すると、それはrunModalForWindow:
コール(常にではない)でのmallocエラーログメッセージを出力します。
malloc: *** error for object 0xbc65840: double free
.....
malloc: *** error for object 0xbc547e0: pointer being freed was not allocated
セカンダリスレッドからrunModalForWindow:
を使用することが本当に悪いですか?
クラッシュの原因になりますか?
あなたはこの特定のクラッシュの原因について正しいかもしれませんが、セカンダリスレッドからのUI操作の重要性を却下する際に間違いがあります。セカンダリスレッドからUIを変更することで、大きな問題やクラッシュを引き起こすことがあります。 [スレッドセーフティサマリー](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html)を読んでください。 –
ありがとう!これは本当に有益な文書です。 – 9dan