我使用的是NSThread如下NSThread內存泄漏
NSThread * thread = [[NSThread alloc] initWithTarget:object selector:@selector(bg) object:nil];
[thread start];
後來我想停止線程和釋放對象,如下所示:
[thread cancel];
[object release];
這似乎是工作確定。然而,當我看到泄漏工具時,我看到一些神祕的泄漏不是來自我的代碼(一個空的NSArray)。當我查看malloc歷史記錄時,我發現NSArray被分配在最終從我的[object dealloc]中調用的「willChangeValueForKey」方法中。恰好是將委託設置爲零。該代表正在被觀察(因此willChangeValueForKey?)。從[NSThread出口]調用[object dealloc]。
我的猜測是,這是因爲[線程取消]不會立即停止線程(畢竟它是在不同的線程中)。然後我們在主線程上釋放對象。 這將其retainCount保留爲1.然後NSThread會在實際上停轉時釋放對象。看起來這會導致泄漏。我想這個快速變化來驗證我的假設:
[thread cancel];
[NSThread sleepForTimeInterval:1];
// This makes it wait until the thread releases [object]
[object release];
問:爲什麼是不安全的,讓NSThread解除分配我的對象?它是否與dealloc中的觀察者代碼不安全有關?
您的'willChange' /'didChange'是否在調用'addObserver:'和'removeObserver:'的相同線程上發生? – iluvcapra 2013-02-15 00:52:07
你的線程是否有自己的autorelease池? – 2013-02-15 02:24:43
autoreleasepool:是的。至於iluvcapra的問題:我不確定。這段代碼非常複雜,所以我不能100%確定。可以讓他們在不同的線程導致泄漏? – George 2013-02-15 08:59:06