iOS應用程式中UITableView的效能優化(最全面)

weixin_33816300發表於2016-07-21

由於iOS裝置的限制,想處理好應用程式中的效能是一件難事。我們在開發過程中會有很多地方是需要注意的,當然也很容易在做出選擇時忘記考慮效能影響。

對tableView的優化:

UITableView作為iOS開發中最重要的控制元件之一,為了獲得更好的滑動效能,我們可以採取以下的措施:

·正確使用`reuseIdentifier`來重用cells

·儘量使所有的view opaque,包括cell自身

·如果cell內現實的內容來自web,使用非同步載入,快取請求結果

·避免漸變,圖片縮放

·使用`shadowPath`來畫陰影

·快取行高

·減少subviews的數量

·儘量不適用`cellForRowAtIndexPath:`,如果你需要用到它,只用一次然後快取結果

·使用正確的資料結構來儲存資料

·儘量少於或者不用透明圖層

以下是詳細的介紹:

1、在應用程式中正確的地方使用:ReuseIdentifier

1046066-be8c1e76e3ca9355.png

我們在開發中常見的錯誤就是沒有給UITableViewCells,UICollectionViewCells,甚至是UITableViewHeaderFooterViews設定正確的reuseIdentifier。

在優化效能時,table view用`tableView:cellForRowAtIndexPath:`為rows分配cells的時候,它的資料應該重用自UITableViewCell。一個table view維持一個佇列的資料可重用的UITableViewCell物件。當然如果不使用reuseIdentifier的話,每顯示一行table view就需要設定全新的cell。這樣一來對應用程式效能的影響非常的大,特別會使app的滾動體驗大大的降低。

從iOS6起,除了對UICollectionView的cells和補充views,也應該在header和footer views中使用reuseIdentifiers,使用reuseIdentifiers的話,在一個table view中新增一個新的cell時在data source 方法中新增這個方法:

staticNSString*ID =@"MyCell";

UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:ID];

這個方法可以把那些已經存在的cell從佇列中排除,或者在必要時使用先前註冊的nib或者class創造新的cell。如果沒有可重用的cell,也沒有註冊一個class或者nib的話,這個方法就會返回nil。

2、在開發的過程中要儘量把Views設定為透明色:

1046066-86db2be41c89a3c2.png

如果應用中有透明的Views我們應該設定它們的opaque屬性為YES。

其原因是這樣會使系統用一個最優的方式渲染這些views。這個屬性在IB或者程式碼裡都可以設定。

Apple的文件對於為圖片設定透明屬性的描述是:

(opaque)這個屬性給渲染系統提供了一個如何處理這個view的提示。如果設為YES,渲染系統就認為這個view是完全不透明的,這使得渲染系統優化一些渲染過程和提高效能。如果設定為NO,渲染系統正常地和其它內容組成這個View。預設值是YES。

在相對比較靜止的畫面中,設定這個屬性不會有太大影響。然而當這個view嵌在scroll view裡邊,或者是一個複雜動畫的一部分,不設定這個屬性的話會在很大程度上影響app的效能。所以我們可以在模擬器中用Debug\Color Blended Layers選項來發現哪些view沒有被設定為opaque。目標就是,能設為opaque的就全設為opaque!

3、在ImageView中調整圖片的大小:

如果要在`UIImageView`中顯示一個來自bundle的圖片,你應保證圖片的大小和UIImageView的大小相同。在執行中縮放圖片是很耗費資源的,特別是`UIImageView`巢狀在`UIScrollView`中的情況下。

如果圖片是從遠端服務載入的你不能控制圖片大小,比如在下載前調整到合適大小的話,你可以在下載完成後,最好是用background thread,縮放一次,然後在UIImageView中使用縮放後的圖片。

4、選擇正確的資料格式:

從app和網路服務間傳輸資料有很多方案,最常見的就是JSON和XML。如果讓我們選擇對app來說最合適的一個,那麼解析JSON會比XML更快一些,JSON也通常更小更便於傳輸。從iOS5起就有了官方內建的JSON deserialization就更加方便使用了。

但是使用XML也有XML的好處,比如使用SAX來解析XML就像解析本地檔案一樣,我們不需像解析json一樣等到整個文件下載完成才開始解析,那麼當我們處理很大的資料的時候就會極大地減低記憶體消耗和增加效能。

XML的解析方式:

①DOM解析:是將文件一次性全部下載到本地在按節點進行解析,這樣對我們的應用程式的記憶體消耗極大,手機本身的記憶體就不是很大,不像電腦那樣有很大的記憶體,可見這種解析方式不太適用於手機,即手機無法直接使用 DOM 的方式來解析 XML;

②SAX解析:是一種只讀的方式,在文件中按照節點從上之下的方式來進行解析,是蘋果提供的解析方式,雖然節點是一次性讀取的,但是節點中的內容是多次讀取的,這種解析方式的速度相當的快,可以用NSXMLParser通過代理方法來實現解析;

SAX解析方式的步驟:

①開始文件—準備工作

②開始"節點"

③發現節點內部的內容,每一個節點,可能都需要多次解析才能完成

④結束"節點"

⑤結束文件—解析結束

以上步驟,②、③、④會不斷迴圈,一直到所有的解析完成。

5、避免反覆處理資料:

我們的應用需要從伺服器載入所需的常用的JSON或者XML格式的資料。在伺服器端和客戶端使用相同的資料結構很重要。在記憶體中運算元據使它們滿足我們的資料結構開銷很大的。

譬如我們需要資料來展示一個table view,最好直接從伺服器取array結構的資料以避免額外的中間資料結構改變。相似的,如果需要從特定key中取資料,那麼就使用鍵值對的dictionary。


如果以上總結有欠缺的地方,請大神多多指教.

github: iOS_愚非愚餘 歡迎star..      


參考iOS開發進階,感謝xiao66guo;

相關文章