2014-01-11 56 views
0

我正在用顯示圖像的自定義單元格構建UItableView。問題是,當我向下滾動時,以前的單元格似乎沒有執行dealloc並且設備內存正在填滿。UITableView單元格沒有執行dealloc

這是我的代碼:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *simpleTableIdentifier = @"SimpleTableItem"; 
    CustomTableCellView *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier forIndexPath:indexPath]; 

    if (cell == nil) { 
     cell = [[CustomTableCellView alloc] initWithStyle:UITableViewCellStyleDefault 
              reuseIdentifier:simpleTableIdentifier]; 
    } 

    Article *tempArticle = [_objects objectAtIndex:indexPath.row]; 
    cell.titel.text = tempArticle.title; 
    cell.subTitle.text = tempArticle.subTitle; 
    cell.category.text = tempArticle.category; 
    if(tempArticle.imageUrl){ 
     [cell.image setImageWithURL:[NSURL URLWithString:tempArticle.imageUrl]]; 
    } else { 
     cell.image.image = [UIImage imageNamed:@"video"]; 
    } 

    return cell; 
} 

enter image description here

+0

單元格未被表視圖釋放,因爲它們被重用。如果你在你的'if'中放置一個斷點,你會注意到在初始加載後,它不會再停留在那裏,因爲表可以使現有的單元出隊。問題可能在其他地方。 –

+0

你猜測單元沒有被釋放。通過儀器運行您的應用程序,並獲取幾個內存快照,以確切查看哪些對象正在使用內存。 – Abizern

+0

好吧,我知道它被重用了,但它爲什麼會填滿內存? – Verendus

回答

0

我99%確定內存增加是由於圖像加載&緩存。 AFnetworking它使用NSCache實例來緩存下載的圖像,此緩存在內存中執行,當系統確定內存不足時它將被耗盡,這不是問題。

此外imageNamed方法緩存以與AFNetworking相同的方式加載的圖像。

爲了檢查是否有泄漏或某些東西無法正常使用您的數據,請檢查在向後滾動後內存是否增加,如果內存保持不變,而不是您沒有問題,泄漏(也可以用儀器檢查泄漏),緩存的圖像是導致內存增加的圖像。

同時從堆棧中刪除視圖控制器(彈出,刪除),這將導致文本,標籤或其他數據(而不是圖像)的一些釋放,如果內存減少(它不會大幅度減少)那麼你是在正確的方式。

0

如上所述,你是正確設置重用標識符。

也許它填補了內存,因爲你使用AFNetworking庫和下載圖像爲你的細胞?請更確切地定義「填滿記憶」。

+0

好吧,當我的意思是「填滿內存「,我的意思是,當向下滾動更多的設備內存使用。這可能是佔用記憶的圖像。即使我刪除[單元格。image setImageWithURL:[NSURL URLWithString:tempArticle.imageUrl]]; 它仍然佔用更多的內存作爲向下滾動,但沒有那麼多。我猜是哪個文字。 – Verendus

相關問題