天天看點

傷不起的imageNamed方法

前段時間開發的時候總是遇到莫名其妙的崩潰。最後終于找出來是什麼鬼原因: 

1 [UIImage imageNamed:];

緩存了過多的大圖檔導緻記憶體用盡,最後崩潰。最後解決這個問題的方法如下: 

首先隻緩存減小了大小的圖檔,然後需要用到大圖檔時從直接讀取不緩存。 

不過很明顯,這個方法不夠好。幾天以後應用還是無聲無息的崩潰了。經過多次的檢查,排除了其他代碼 

的記憶體洩露等問題。再看console,裡面一堆系統記憶體警告,然後退出了背景程序知道應用挂了。 

是以,很明顯+imageNamed這個方法簡直太詭異了。即使什麼清空緩存什麼的估計也不管用。 

這并不是什麼難題,如果你幹脆放棄緩存的話,蘋果的例子代碼中有這麼一個函數足可使用。函數的注釋也說的很清楚。 

<a></a>

- (UIImage *)tileForScale:(CGFloat)scale row:(int)row col:(int)col{

     // we use "imageWithContentsOfFile:" instead of "imageNamed:" here because we don't want UIImage to cache our tiles

    NSString *tileName = [NSString stringWithFormat:@"%@_%d_%d_%d", imageName, (int)(scale * 1000), col, row];

    NSString *path = [[NSBundle mainBundle] pathForResource:tileName ofType:@"png"]; 

    UIImage *image = [UIImage imageWithContentsOfFile:path];

    return image;

}

或者你非要緩存,比如我們的應用。可以用一個NSMutableDictionary來緩存圖檔。 

 1 - (UIImage*)thumbnailImage:(NSString*)fileName

 2 { 

 3    UIImage *thumbnail = [thumbnailCache objectForKey:fileName

 4    if (nil == thumbnail)

 5    {

 6       NSString *thumbnailFile = [NSString stringWithFormat:@"%@/thumbnails/%@.jpg", [[NSBundle mainBundle] resourcePath], fileName];

 7       thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];

 8       [thumbnailCache setObject:thumbnail forKey:fileName];

 9    }

10    return thumbnail;

11 }

如果遇到記憶體低的警告,隻要

1 [thumbnailCache removeAllObjects];

就OK了。 

是以,無論如何在有大量圖檔的情況下千萬不要使用

1 [UIImage imageNamed];

這個詭異的方法了。你可以試試上面的方法。希望對你有幫助。

歡迎加群互相學習,共同進步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,轉載請注明出處!

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sunshine-anycall/archive/2012/07/17/2595812.html,如需轉載請自行聯系原作者

上一篇: less網站
下一篇: less筆記

繼續閱讀