一、UITableView的復用機制
UITableView最核心的思想就是UITableViewCell的重用機制。簡單的理解就是:UITableView只會創建一屏幕(或一屏幕多一點)的UITableViewCell,其他都是從中取出來重用的。每當Cell滑出屏幕時,就會放入到一個集合(或數組)中(這里就相當于一個重用池),當要顯示某一位置的Cell時,會先去集合(或數組)中取,如果有,就直接拿來顯示;如果沒有,才會創建。這樣做的好處可想而知,極大的減少了內存的開銷。
知道UITableViewCell的重用原理后,我們來看看UITableView的回調方法。UITableView最主要的兩個回調方法是tableView:cellForRowAtIndexPath和tableView:heightForRowAtIndexPath。理想上我們是會認為UITableView會先調用前者,再調用后者,因為這和我們創建控件的思路是一樣的,先創建它,再設置它的布局。但實際上卻并非如此,我們都知道,UITableView是繼承自UIScrollView的,需要先確定它的contentSize及每個Cell的位置,然后才會把重用的Cell放置到對應的位置。所以事實上,UITableView的回調順序是先多次調用tableView:heightForRowAtIndexPath:以確定contentSize及Cell的位置,然后才會調用tableView:cellForRowAtIndexPath:,從而來顯示在當前屏幕的Cell。
舉個例子來說:如果現在要顯示100個Cell,當前屏幕顯示5個。那么刷新(reload)UITableView時,UITableView會先調用100次tableView:heightForRowAtIndexPath:方法,然后調用5次tableView:cellForRowAtIndexPath:方法;滾動屏幕時,每當Cell滾入屏幕,都會調用一次tableView:heightForRowAtIndexPath:、tableView:cellForRowAtIndexPath:方法。
看到這里,想必大伙也都能隱約察覺到,UITableView優化的首要任務是要優化上面兩個回調方法。事實也確實如此,下面按照我探討進階的過程,來研究如何優化:
UITableView的優化主要從三個方面入手:
1、提前計算并緩存好高度(布局),因為heightForRowAtIndexPath:是調用最頻繁的方法;
2、異步繪制,遇到復雜界面,遇到性能瓶頸時,可能就是突破口;
3、滑動時按需加載,這個在大量圖片展示,網絡加載的時候很管用!(SDWebImage已經實現異步加載,配合這條性能杠杠的)。
除了上面最主要的三個方面外,還有很多幾乎大伙都很熟知的優化點:
1、正確使用reuseIdentifier來重用Cells
2、盡量使所有的view opaque,包括Cell自身
3、盡量少用或不用透明圖層
4、如果Cell內現實的內容來自web,使用異步加載,緩存請求結果
5、減少subviews的數量
6、在heightForRowAtIndexPath:中盡量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后緩存結果
7、盡量少用addView給Cell動態添加View,可以初始化時就添加,然后通過hide來控制是否顯示
說明:
本文是從網上摘抄下來的,供本人學習使用