2013-02-14 41 views
0

我有一個運行下面的代碼NSThread分配的對象不能在循環中發佈單獨的線程

for (Experiment *exp in experiments) { 
    ExperimentBlock *block = [[ExperimentBlock alloc] initWithFrame:CGRectMake(0, maxHeight, 310, 50) 
                 experiment:exp 
                  target:self 
                  action:@selector(onExperimentButtonClicked:)]; 
    [scrollView addSubview:block]; 
    // block cannot be released for some inadequately explained reason 
    maxHeight += 60; 
} 

良好的內存管理實踐希望我們能釋放我們分配,複製或new'ed任何對象。然而,當我的線程結束時,如果我已發佈(或自動發佈)已添加到我的UIScrollView中的塊,則在消失之前,對象會顯示在我的UIScrollView中一秒。

我該如何釋放內存而不會丟失這些對象?

回答

4

您絕不能在後臺線程上修改視圖(調用addSubview:)。這就是爲什麼你會得到奇怪的行爲。您必須在主線程上撥打addSubview:

這種工作通常比GCD或NSOperationQueue要好得多。手冊NSThread在大多數情況下效率較低,並且更難以正確編碼。您可以將您的通話addSubview:到主隊列是這樣的:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.scrollView addSubview:block]; 
    [block release]; 
}); 

的調用self這裏是故意的。它創建一個臨時保留循環,以確保在代碼運行之前我們不能被釋放。

將此項目切換到ARC將簡化此處的內存管理,並且建議您使用。