可能造成tableView卡頓的原因有:
1.最常用的就是cell的重用团驱, 注冊重用標識符
如果不重用cell時沮尿,每當一個cell顯示到屏幕上時丛塌,就會重新創(chuàng)建一個新的cell
如果有很多數(shù)據(jù)的時候,就會堆積很多cell畜疾。
如果重用cell赴邻,為cell創(chuàng)建一個ID,每當需要顯示cell 的時候啡捶,都會先去緩沖池中尋找可循環(huán)利用的cell姥敛,如果沒有再重新創(chuàng)建cell
2.避免cell的重新布局
cell的布局填充等操作 比較耗時,一般創(chuàng)建時就布局好
如可以將cell單獨放到一個自定義類瞎暑,初始化時就布局好
3.提前計算并緩存cell的屬性及內(nèi)容
當我們創(chuàng)建cell的數(shù)據(jù)源方法時彤敛,編譯器并不是先創(chuàng)建cell 再定cell的高度
而是先根據(jù)內(nèi)容一次確定每一個cell的高度,高度確定后了赌,再創(chuàng)建要顯示的cell墨榄,滾動時,每當cell進入憑虛都會計算高度勿她,提前估算高度告訴編譯器袄秩,編譯器知道高度后,緊接著就會創(chuàng)建cell,這時再調(diào)用高度的具體計算方法之剧,這樣可以方式浪費時間去計算顯示以外的cell
4.減少cell中控件的數(shù)量
盡量使cell得布局大致相同贮喧,不同風格的cell可以使用不用的重用標識符,初始化時添加控件猪狈,
不適用的可以先隱藏
5.不要使用ClearColor箱沦,無背景色,透明度也不要設(shè)置為0
渲染耗時比較長
6.使用局部更新
如果只是更新某組的話雇庙,使用reloadSection進行局部更
7.加載網(wǎng)絡(luò)數(shù)據(jù)谓形,下載圖片,使用異步加載疆前,并緩存
8.少使用addView 給cell動態(tài)添加view
9.按需加載cell寒跳,cell滾動很快時,只加載范圍內(nèi)的cell
10.不要實現(xiàn)無用的代理方法竹椒,tableView只遵守兩個協(xié)議
11.緩存行高:estimatedHeightForRow不能和HeightForRow里面的layoutIfNeed同時存在童太,這兩者同時存在才會出現(xiàn)“竄動”的bug。所以我的建議是:只要是固定行高就寫預(yù)估行高來減少行高調(diào)用次數(shù)提升性能胸完。如果是動態(tài)行高就不要寫預(yù)估方法了书释,用一個行高的緩存字典來減少代碼的調(diào)用次數(shù)即可
12.不要做多余的繪制工作。在實現(xiàn)drawRect:的時候赊窥,它的rect參數(shù)就是需要繪制的區(qū)域爆惧,這個區(qū)域之外的不需要進行繪制。例如上例中锨能,就可以用CGRectIntersectsRect扯再、CGRectIntersection或CGRectContainsRect判斷是否需要繪制image和text,然后再調(diào)用繪制方法址遇。
13.預(yù)渲染圖像熄阻。當新的圖像出現(xiàn)時,仍然會有短暫的停頓現(xiàn)象倔约。解決的辦法就是在bitmap context里先將其畫一遍秃殉,導(dǎo)出成UIImage對象,然后再繪制到屏幕跺株;
14.使用正確的數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù)复濒。
我的更多文章:你等下課滴
您可以關(guān)注我以便隨時查看我最新的文章脖卖,本篇文章是為了做筆記乒省,順便提供給大家共同學習進步!如果您對本篇文章有任何疑問畦木,請留言給我袖扛,有什么錯誤也可以留言提醒,如果對大家有幫助我很榮幸!感謝蛆封!