iOS開發中,我們最常用就是表格視圖(UITableView),最近閱讀了一些大牛的博客,學習了一些關于UITableView的資料,對TableView有了更深的理解,對此寫下一些總結。
UITableView的工作原理
1> tablewView代理方法的執行順序UITableView返回多少組----->每組返回多少行cell--->計算每個cell的高度---->指定cell(cell布局);
2> cell的復用原理:
當滾動列表時(UITableView)部分cell會移除Window,但是移除的cell并沒有被立即釋放,而是放到了一個叫做復用池的對象池中,處于待定狀態。
當有新的cell要出現在Window界面上時,首先會從復用池中尋找是否有相同類型的cell,如果有直接拿過用(最直觀的表現是新出現的cell有沒有開辟新的內存空間,通俗點,就是有沒有開辟出新的坑位)。
如果沒有,創建一個新的類型的cell。
所以,UITableView可能擁有多種類型的cell,復用池也可能存儲著多種類型的cell,系統通過定義reuseIndentifer作為每個cell的唯一標示符來確定即將出現的cell是復用何種類型的cell。
為什么要優化?
我們知道,現在的手機跟電腦一樣,也有CPU和GPU,CPU主要從事邏輯計算的一些工作,GPU主要從事圖形處理方面的工作。
CPU和GPU都是為了完成計算任務而設計,CPU的核少,而核內空間非常大,能夠處理復雜的邏輯,GPU核多,但是每個核的空間相對較小,故而處理復雜邏輯的空間較少。
優化的目的:
平衡CPU和GPU在工作上的壓力,從而正確的使用CPU和GPU的資源,使他們均勻的負載,這樣子使得FPS保持在60幀左右,最終使得用戶體驗更加美好。
UITableView的具體優化
1)盡量使用cell的復用,可以減少內存的開銷,沒有開辟新的空間,也減少了一些計算量;
2)對于不定高的cell,提前將每個cell的高度存入數組,出現一個cell的時候,直接從數組中拿出確切的高度即可,不用臨時計算cell的高度,圖文混排、評論等對于固定高的cell和不定高的cell同樣適用;
3)涉及網絡請求加載數據,在UITableView滑動結束的時候在進行加載數據(渲染)避免卡頓;
4)對于tableView的自定義控件 尤其是UIImageView,盡量減少使用圓角,陰影等layer屬性,盡量減少使用alpha(透明度)來設置透明度,(在項目開發中,讓UI設計師設計原圖就是帶圓角的圖) 陰影,圓角這些layer效果都是在GPU中完成的;
5)盡量使用懶加載,又稱為延遲加載 實際上是重寫某個對象的getter方法 原理:程序一開始并不對它進行初始化 而是在用到他的時候 才為他開辟內存供它使用,這樣寫的好處就是代碼可讀性強,代碼之間獨立性強,松耦合;
6)減少返回給的cell里面的處理邏輯和處理時間;
7)設置每個cell的opaque屬性,即不透明屬性;
8)分段加載數據。