2011-08-18 40 views
2

我的印象是,表格視圖單元格從來沒有得到處理,直到應用程序崩潰,因爲你可以重用它們。但是當我分析我的表格視圖時,我意識到在我的自定義單元格上調用了dealloc。到底是什麼dealloc的自定義單元格,我可以阻止它?什麼時候自定義表格視圖單元dealloc?

回答

4

使用常見的「重用」圖案:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellId = @"Foo"; 
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellId]; 
    if (!cell) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId] 
       autorelease]; 
    } 
    // update the cell content 
    return cell; 
} 

表視圖創建根據需要來填充它的框架的高度的許多細胞。
當從屏幕消失時,它們將從視圖中移除並放入重用隊列中,從而不會釋放。

當tableView被解除分配時,所有的單元格都會被釋放,並且當您的行數發生變化時(例如,您之前有20個單元,更新之後只有2個單元),某些單元可能會被釋放。

您可能會想要擺脫細胞重用,但您會失去所有背後的魔法,以保持較低的內存佔用量並具有平滑的滾動體驗。

+0

謝謝,整個更新行是有道理的 – TheBinaryhood

1

dequeueReusableCellWithIdentifier:選擇器的語義是不透明的(據我所知)。如果要完全控制表格視圖單元格,請不要使用該選擇器來獲取單元格:只需構建一個新單元格或使用自己的池進行重用。

+0

但無論如何,它不應該釋放它,它應該重用它。唯一的原因是我不想再次從筆尖加載,這會降低應用程序的速度。 – TheBinaryhood

0

表視圖根據需要創建和刪除單元格。這是爲了允許非常長的列表滾動而不將它們全部存儲在內存中。一個幾乎無限的可滾動列表是可能的。爲表格視圖的使用壽命保留自定義單元格的一種便捷方式是在創建時將它們添加到可變數組中。在創建之前,查看數組以查看它是否已經存在。

+0

但是,如果我預先加載它們,我可以抓住單元格並複製它嗎?如果不是,那意味着我需要一個幾乎無限的單元陣列。 – TheBinaryhood

+0

您可以預加載它們,也可以根據需要創建它們。你不需要無限的單元格陣列。只需使用一個NSMutableArray並根據需要添加它們即可。如果沒有別的,它會讓他們保留給你。 –

相關問題