UITableView的復用機制以及優(yōu)化

一、UITableView的復用機制

UITableView最核心的思想就是UITableViewCell的重用機制。簡單的理解就是:UITableView只會創(chuàng)建一屏幕(或一屏幕多一點)的UITableViewCell,其他都是從中取出來重用的。每當Cell滑出屏幕時,就會放入到一個集合(或數(shù)組)中(這里就相當于一個重用池),當要顯示某一位置的Cell時,會先去集合(或數(shù)組)中取,如果有,就直接拿來顯示;如果沒有,才會創(chuàng)建。這樣做的好處可想而知,極大的減少了內(nèi)存的開銷。

知道UITableViewCell的重用原理后,我們來看看UITableView的回調(diào)方法。UITableView最主要的兩個回調(diào)方法是tableView:cellForRowAtIndexPath和tableView:heightForRowAtIndexPath。理想上我們是會認為UITableView會先調(diào)用前者,再調(diào)用后者,因為這和我們創(chuàng)建控件的思路是一樣的,先創(chuàng)建它,再設置它的布局。但實際上卻并非如此,我們都知道,UITableView是繼承自UIScrollView的,需要先確定它的contentSize及每個Cell的位置,然后才會把重用的Cell放置到對應的位置。所以事實上,UITableView的回調(diào)順序是先多次調(diào)用tableView:heightForRowAtIndexPath:以確定contentSize及Cell的位置,然后才會調(diào)用tableView:cellForRowAtIndexPath:,從而來顯示在當前屏幕的Cell。

舉個例子來說:如果現(xiàn)在要顯示100個Cell,當前屏幕顯示5個。那么刷新(reload)UITableView時,UITableView會先調(diào)用100次tableView:heightForRowAtIndexPath:方法,然后調(diào)用5次tableView:cellForRowAtIndexPath:方法;滾動屏幕時,每當Cell滾入屏幕,都會調(diào)用一次tableView:heightForRowAtIndexPath:、tableView:cellForRowAtIndexPath:方法。

看到這里,想必大伙也都能隱約察覺到,UITableView優(yōu)化的首要任務是要優(yōu)化上面兩個回調(diào)方法。事實也確實如此,下面按照我探討進階的過程,來研究如何優(yōu)化:

UITableView的優(yōu)化主要從三個方面入手:

1、提前計算并緩存好高度(布局),因為heightForRowAtIndexPath:是調(diào)用最頻繁的方法;
2、異步繪制,遇到復雜界面,遇到性能瓶頸時,可能就是突破口;
3、滑動時按需加載,這個在大量圖片展示,網(wǎng)絡加載的時候很管用!(SDWebImage已經(jīng)實現(xiàn)異步加載,配合這條性能杠杠的)。

除了上面最主要的三個方面外,還有很多幾乎大伙都很熟知的優(yōu)化點:

1、正確使用reuseIdentifier來重用Cells
2、盡量使所有的view opaque,包括Cell自身
3、盡量少用或不用透明圖層
4、如果Cell內(nèi)現(xiàn)實的內(nèi)容來自web,使用異步加載,緩存請求結(jié)果
5、減少subviews的數(shù)量
6、在heightForRowAtIndexPath:中盡量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后緩存結(jié)果
7、盡量少用addView給Cell動態(tài)添加View,可以初始化時就添加,然后通過hide來控制是否顯示

說明:
本文是從網(wǎng)上摘抄下來的,供本人學習使用

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容