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