2012-06-12 136 views
0

所以這可能有點難以解釋,但我會盡我所能。這個問題也可能需要幾個步驟來解決。如何創建一組uiimages的副本?

此代碼出現在tableviewcell,所以它的運行每次池都在屏幕上的時間:

[cell.cellContent.thumbnails removeAllObjects]; 

if ([self.cellThumbnailCache objectForKey:[NSNumber numberWithInt:indexPath.row]]) { 
    cell.cellContent.thumbnails = [self.cellThumbnailCache objectForKey:[NSNumber numberWithInt:indexPath.row]]; 
    [cell.cellContent setNeedsDisplay]; 
} 
else { 

    //First it removes all the existing UIImages from the cell.cellContent.thumbnails mutable array. 
    int i = 0; 

    while (i < numberOfThumbnailsToDraw) { 
     Media *media = [entryNewMoc.media objectAtIndex:i]; 
     UIImage *image = [media getThumbnail]; 

     [newMoc save:nil]; 

     [cell.cellContent.thumbnails addObject:image]; 
     i++; 
    } 

    //Then it goes through getting UIImages and adding them to the array. 
    [self.cellThumbnailCache setObject:cell.cellContent.thumbnails forKey:[NSNumber numberWithInt:indexPath.row]]; 
    [cell.cellContent setNeedsDisplay]; 

    //Then it all gets drawn in setNeedsDisplay. 
}   

的問題是,當它回來輪刪除所有對象,這似乎刪除實際記錄中的UIImages,因爲縮略圖緩存中的NSLog顯示條目爲空。這是它的removeAllObjects行,但如果它保持不變,那麼它只是向單元添加更多媒體。

+0

店面形象。圖像將以這種格式image_0.png,image_1.png,....... –

+0

首先,可以簡化'if' /'else':'cell.cellContent.thumbnails = [self.cellThumbnailCache objectForKey:[ NSNumber numberWithInt:indexPath.row]];如果(!cell.cellContent.thumbnails){//做另一個分支的東西'第二,如果密鑰只是一個由整數構成的「NSNumber」,爲什麼要使用字典呢?您可以使用數組。另外,爲什麼使用'while'循環來做'for'的工作? –

+0

@JoshCaswell使用字典是因爲單元格沒有按順序加載,因此無法在14-19不存在時添加objectAtIndex:20。而不是..我總是使用whiles,從來沒有與fors舒適。據我所知,它做的是同樣的工作,我現在更願意堅持使用它。 – Andrew

回答

2

嘗試,如果沒有存儲eitherwise從中獲取圖像文件目錄指定簡單的複製,像即:

[self.cellThumbnailCache setObject:[NSSet setWithSet:cell.cellContent.thumbnails] .... 
+0

不,不起作用。指針仍然在同一位置,所以它仍然會刪除它們指向的位置,我猜。 – Andrew

+0

@Andrew,如果這不起作用,那麼別的東西就是錯的。你給'cellThumbnailCache'字典一個指向'thumbnails'可變集的指針。如果您隨後將'removeAllObjects'發送到集合,則無論您是通過「縮略圖」還是字典訪問它,都會看到一個空集。但是,如果您在將字典放入字典時製作_copy_,則該字典會有自己的版本。該集合中的對象將被該副本保留並繼續運行。 –

+0

我想你也必須修改這一行: cell.cellContent.thumbnails = [self.cellThumbnailCache objectForKey:[NSNumber numberWithInt:indexPath.row]]; 所以在這裏你也必須分配一個副本,因爲否則圖像將被釋放,因爲這是它們唯一的引用 –