UITableView最核心的思想就是UITableViewCell的重用機制。簡單的理解就是:UITableView只會創建一屏幕(或一屏幕多一點)的UITableViewCell,其他都是從中取出來重用的。每當Cell滑出屏幕時,就會放入到一個集合(或數組)中(這里就相當于一個重用池),當要顯示某一位置的Cell時,會先去集合(或數組)中取,如果有,就直接拿來顯示;如果沒有,才會創建。這樣做的好處可想而知,極大的減少了內存的開銷。
舉個例子來說:如果現在要顯示100個Cell,當前屏幕顯示5個。那么刷新 dUITableView時,UITableView會先調用100次tableView:heightForRowAtIndexPath:方法,然后調用5次tableView:cellForRowAtIndexPath:方法;滾動屏幕時,每當Cell滾入屏幕,都會調用一次tableView:heightForRowAtIndexPath:、tableView:cellForRowAtIndexPath:方法。
優化主要從三個方面入手:
? 提前計算并緩存好高度(布局),因為heightForRowAtIndexPath:是調用最頻繁的方法。
? 異步自定義繪制,遇到復雜界面,遇到性能瓶頸時,可能就是突破口。
? 滑動時按需加載,這個在大量圖片展示,網絡加載的時候很管用!(SDWebImage已經實現異步加載,配合這條性能杠杠的)。
除了上面最主要的三個方面外,還有很多幾乎大伙都很熟知的優化點:
? 正確使用reuseIdentifier來重用Cells?
? 盡量使所有的view opaque,包括Cell自身?
? 盡量少用或不用透明圖層
? 如果Cell內現實的內容來自web,使用異步加載,緩存請求結果
? 減少subviews的數量
? 在heightForRowAtIndexPath:中盡量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后緩存結果
? 盡量少用addView給Cell動態添加View,可以初始化時就添加,然后通過hide來控制是否顯示