在做 tomcat 小例子的時候,發(fā)現(xiàn)了這個問題,摘自官方文檔
+ (UIImage *)imageWithContentsOfFile:(NSString *)path
通過加載指定路徑(全路徑)中的文件,查找加載圖像數(shù)據(jù),從而生成并返回一個圖形對象(或者 nil),但是僅僅是加載出圖像的對象,并不緩存這個圖形對象。
一般用法:
NSString *file = [[NSBundle mainBundle] pathForResource:name ofType:nil];UIImage *image = [UIImage imageWithContentsOfFile:file];其實(shí),仔細(xì)看,很顯然,在文檔里,官方是Creating New Images下面的方法介紹。僅僅是創(chuàng)建新圖片對象。
再看
imageNamed:inBundle:compatibleWithTraitCollection:
屬于目錄Cached Image Loading Routines下,是在包bundle中,通過匹配某特征(直接寫圖片名字即可),返回一個圖像,餅把圖緩存。
+ (UIImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundlecompatibleWithTraitCollection:(UITraitCollection *)traitCollection
參數(shù)分別是圖片名字,圖片在的包,用來描述希望生成的圖的特征的集合。這三個參數(shù)的此方法是 IOS8的新特性!如果找不到匹配的就返回 nil。
成功生成圖片對象之后,如果在內(nèi)存里這個生成的圖片緩存不存在了,那么這個方法還是會去磁盤或者其他資源里定位并加載這個圖片數(shù)據(jù),返回。故,緩存一直存在!
此方法屬于線程不安全的!
這里要看下這個
UITraitCollection
這個類是視圖管理器的一些特征、細(xì)節(jié)存儲的集合類,比如比例,尺寸等,當(dāng)視圖控制器生成,那么這個集合也自動為這個視圖控制器生成一個對象。當(dāng)然,一些其他的類,比如 UIImage 類,也會擁有類似的功能去存相同的特征。
一個參數(shù)的
+ (UIImage *)imageNamed:(NSString *)name
返回的是圖形對象(或者nil),且有緩存,如果這個圖是第一次被加載,那么這個方法會去app 的主包里通過 name尋找這個圖片。這也就是為什么,在往項目中拖拽圖片素材時,通常看選擇
1> Destination: 勾選
2> Folders:
的不同,那么使用的方法是受限制的。
因為選擇第一項:生成的黃色文件夾(區(qū)分點(diǎn)),在Xcode中分文件夾,但是在Bundle中所有素材都在同一個文件夾下,開發(fā)效率很高,因此,不能出現(xiàn)文件重名的情況,可以直接使用[NSBundle mainBundle]作為資源路徑,效率高!可以使用[UIImage imageNamed:]加載圖像。選擇第二項:生成藍(lán)色文件夾(特點(diǎn)),那么Xcode中分文件夾,Bundle中同樣分文件夾,因此,可以出現(xiàn)文件重名的情況,那么需要在[NSBundle mainBundle]的基礎(chǔ)上拼接實(shí)際的路徑,效率較差!且不能使用[UIImage imageNamed:]加載圖像。
同樣是線程不安全。
總得來說,使用大的圖片,如果不是常用,那么用 imagewithcontentsoffile 方法,比較小的(比如圖標(biāo)),需要經(jīng)常使用的,那么用后者,imageNamed 加載。內(nèi)存常駐,效率高。不過,就如 tomcat 里,那么多圖片,一起用 imagenamed 加載,很容易內(nèi)存泄露,程序崩潰,還需要及時關(guān)閉動畫,清除圖片數(shù)組等措施。
暫時了解下,以后有新發(fā)現(xiàn)再看。
新聞熱點(diǎn)
疑難解答