初學IOS遇到的問題(二)UIImage載入圖片遇到的問題,
問題產生過程:
圖片資源放在Assets.xcassets中,分別用UIImage的類方法imageNamed和imageWithContentsOfFile擷取圖片對象,但發生奇怪的情況,前者擷取到圖片對象,後者結果為nil。代碼如下:
1.通過UIImage的類方法imageNamed:可以擷取到圖片對象。
NSString *imageName = @"test.jpg";UIImage *img = [UIImage imageNamed:imageName];
2.但通過UIImage的類方法imageWithContentsOfFile:得到img為nil
NSString *imageName = @"test.jpg";NSBundle *bundle = [NSBundle mainBundle];NSString *path = [bundle pathForResource:imageName ofType:nil];UIImage *img = [UIImage imageWithContentsOfFile:path];
原因分析:
其實,UIImage建立對象有兩種方法:
- imageNamed:建立的對象會緩衝到系統記憶體中,不會立即釋放到記憶體。好處是再次載入使用這種方式會減少讀取操作,加快程式運行。缺點:載入過多圖片會佔用大量記憶體空間。
- imageWithContentsOfFile:mageWithContentsOfFile建立的對象不會緩衝到系統記憶體中。好處是不產生緩衝。缺點:對於經常使用的小圖片,會頻繁讀取。
imageNamed只需傳檔案名稱,imageWithContentsOfFile需要傳入檔案全路徑。 而通檔案全路徑可以通過NSBundle對象方法 pathForResource: ofType:得到。這時候要注意:Assets.xcassets圖片資源不能通過NSBundle對象方法 pathForResource: ofType:獲得。想擷取Assets.xcassets圖片資源只能使用imageNamed:。
解決方案:
把圖片資源放在Assets.xcassets外的目錄。