2013-03-20 51 views
1
ProductCenterController __weak *tempSelf = self; 

void(^block)(void) = ^{ 
    tempSelf.actIndView = .... 
    [tempSelf.view addSubview:tempSelf.actIndView]; 
}; 

[NSThread detachNewThreadSelector:@selector(actionForThreadBlock:) toTarget:self withObject:block]; 

我發現泄漏 - 「_Block_copy_internal」 ......(我用ARC) ,然後當我最後一行代碼更改爲這樣的事情,漏缺...:爲什麼我需要在我想要使用該塊時「阻止複製」?

[NSThread detachNewThreadSelector:@selector(actionForThreadBlock:) toTarget:self withObject:[block copy]]; 

如果我不使用[塊複製],爲什麼它會導致泄漏?

我認爲,該塊將功能後釋放後完成線程將釋放所有...

怎麼會導致泄漏?

回答

1

塊被創建在堆棧上,所以當你的方法(作用域)結束時它們被釋放。在你的線程嘗試執行已經釋放的塊之後的一段時間,以異常結束。

Copy將塊從堆棧移動到堆內存,所以即使在原始方法結束後它仍將存活。

請在廣泛討論主題時參閱Apple文檔。

+0

ok ......我看到.. thx,但我不知道爲什麼泄漏會顯示「_Block_copy_internal」note/ – GanLiting 2013-03-20 11:19:28

+0

@GanLiting'detachNewThreadSelector ...'保留並使用堆棧上的塊並且已經損壞了內存。在這種狀態下,幾乎任何事情都可能發生使用'copy'你可以解決錯誤的原因,試圖找出內存損壞是如何導致泄漏沒有任何用處的。 – Sulthan 2013-03-20 12:13:53

相關問題