我有一個內存損壞錯誤(我懷疑),這是在特定的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)。 – 2012-04-27 07:21:16
謝謝!這是一個非常有用的文件。 – 9dan 2012-04-27 10:34:06