前段時間開發的時候總是遇到莫名其妙的崩潰。最後終于找出來是什麼鬼原因:
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,如需轉載請自行聯系原作者