一個(gè)App中會(huì)用到很多圖片,你用哪種方式創(chuàng)建才會(huì)更優(yōu)化你的產(chǎn)品呢??
A:imagedNamed初始化
B:imageWithContentsOfFile初始化
imageNamed默認(rèn)加載圖片成功后會(huì)內(nèi)存中緩存圖片,這個(gè)方法用一個(gè)指定的名字在系統(tǒng)緩存中查找并返回一個(gè)圖片對(duì)象.如果緩存中沒(méi)有找到相應(yīng)的圖片對(duì)象,則從指定地方加載圖片然后緩存對(duì)象,并返回這個(gè)圖片對(duì)象.
而imageWithContentsOfFile則僅只加載圖片,不緩存.
大量使用imageNamed方式會(huì)在不需要緩存的地方額外增加開(kāi)銷CPU的時(shí)間來(lái)做這件事.當(dāng)應(yīng)用程序需要加載一張比較大的圖片并且使用一次性,那么其實(shí)是沒(méi)有必要去緩存這個(gè)圖片的,用imageWithContentsOfFile是最為經(jīng)濟(jì)的方式,這樣不會(huì)因?yàn)閁IImage元素較多情況下,CPU會(huì)被逐個(gè)分散在不必要緩存上浪費(fèi)過(guò)多時(shí)間.
使用場(chǎng)景需要編程時(shí),應(yīng)該根據(jù)實(shí)際應(yīng)用場(chǎng)景加以區(qū)分,UIimage雖小,但使用元素較多問(wèn)題會(huì)有所凸顯.
1> 不要在 viewWillAppear 中做費(fèi)時(shí)的操作
viewWillAppear: 在 view 顯示之前被調(diào)用,出于效率考慮,在這個(gè)方法中不要處理復(fù)雜費(fèi)時(shí)的事情;只應(yīng)該在這個(gè)方法設(shè)置 view 的顯示屬性之類的簡(jiǎn)單事情,比如背景色,字體等。要不然,用戶會(huì)明顯感覺(jué)到 view 顯示遲鈍。
2> 在正確的地方使用reuseIdentifier
table view用 tableView:cellForRowAtIndexPath:
為rows分配cells的時(shí)候,它的數(shù)據(jù)應(yīng)該重用自UITableViewCell。 一個(gè)table view維持一個(gè)隊(duì)列的數(shù)據(jù)可重用的UITableViewCell對(duì)象。
3> 盡量把views設(shè)置為透明
如果你有透明的Views你應(yīng)該設(shè)置它們的opaque屬性為YES。原因是這會(huì)使系統(tǒng)用一個(gè)最優(yōu)的方式渲染這些views。這個(gè)簡(jiǎn)單的屬性在IB或者代碼里都可以設(shè)定。
4> 避免過(guò)于龐大的XIB
盡量簡(jiǎn)單的為每個(gè)Controller配置一個(gè)單獨(dú)的XIB,盡可能把一個(gè)View Controller的view層次結(jié)構(gòu)分散到單獨(dú)的XIB中去, 當(dāng)你加載一個(gè)引用了圖片或者聲音資源的nib時(shí),nib加載代碼會(huì)把圖片和聲音文件寫(xiě)進(jìn)內(nèi)存。在OS X中,圖片和聲音資源被緩存在named cache中以便將來(lái)用到時(shí)獲取
5> 不要阻塞主線程
永遠(yuǎn)不要使主線程承擔(dān)過(guò)多。因?yàn)閁IKit在主線程上做所有工作,渲染,管理觸摸反應(yīng),回應(yīng)輸入等都需要在它上面完成,大部分阻礙主進(jìn)程的情形是你的app在做一些牽涉到讀寫(xiě)外部資源的I/O操作,比如存儲(chǔ)或者網(wǎng)絡(luò)。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 選擇一個(gè)子線程來(lái)執(zhí)行耗時(shí)操作
dispatch_async(dispatch_get_main_queue(), ^{
// 返回主線程更新UI
});
});
6> 在Image Views中調(diào)整圖片大小
如果要在UIImageView
中顯示一個(gè)來(lái)自bundle的圖片,你應(yīng)保證圖片的大小和UIImageView的大小相同。在運(yùn)行中縮放圖片是很耗費(fèi)資源的