一诱咏、UITableView的復(fù)用機(jī)制
UITableView最核心的思想就是UITableViewCell的重用機(jī)制氨淌。簡單的理解就是:UITableView只會創(chuàng)建一屏幕(或一屏幕多一點(diǎn))的UITableViewCell源梭,其他都是從中取出來重用的吉挣。每當(dāng)Cell滑出屏幕時(shí),就會放入到一個(gè)集合(或數(shù)組)中(這里就相當(dāng)于一個(gè)重用池)隧熙,當(dāng)要顯示某一位置的Cell時(shí)片挂,會先去集合(或數(shù)組)中取,如果有贱鼻,就直接拿來顯示宴卖;如果沒有,才會創(chuàng)建邻悬。這樣做的好處可想而知症昏,極大的減少了內(nèi)存的開銷。
知道UITableViewCell的重用原理后父丰,我們來看看UITableView的回調(diào)方法肝谭。UITableView最主要的兩個(gè)回調(diào)方法是tableView:cellForRowAtIndexPath和tableView:heightForRowAtIndexPath。理想上我們是會認(rèn)為UITableView會先調(diào)用前者蛾扇,再調(diào)用后者攘烛,因?yàn)檫@和我們創(chuàng)建控件的思路是一樣的,先創(chuàng)建它镀首,再設(shè)置它的布局坟漱。但實(shí)際上卻并非如此,我們都知道更哄,UITableView是繼承自UIScrollView的芋齿,需要先確定它的contentSize及每個(gè)Cell的位置腥寇,然后才會把重用的Cell放置到對應(yīng)的位置。所以事實(shí)上觅捆,UITableView的回調(diào)順序是先多次調(diào)用tableView:heightForRowAtIndexPath:以確定contentSize及Cell的位置赦役,然后才會調(diào)用tableView:cellForRowAtIndexPath:,從而來顯示在當(dāng)前屏幕的Cell栅炒。
舉個(gè)例子來說:如果現(xiàn)在要顯示100個(gè)Cell掂摔,當(dāng)前屏幕顯示5個(gè)。那么刷新(reload)UITableView時(shí)赢赊,UITableView會先調(diào)用100次tableView:heightForRowAtIndexPath:方法乙漓,然后調(diào)用5次tableView:cellForRowAtIndexPath:方法;滾動屏幕時(shí)域携,每當(dāng)Cell滾入屏幕簇秒,都會調(diào)用一次tableView:heightForRowAtIndexPath:鱼喉、tableView:cellForRowAtIndexPath:方法秀鞭。
看到這里,想必大伙也都能隱約察覺到扛禽,UITableView優(yōu)化的首要任務(wù)是要優(yōu)化上面兩個(gè)回調(diào)方法锋边。事實(shí)也確實(shí)如此,下面按照我探討進(jìn)階的過程编曼,來研究如何優(yōu)化:
UITableView的優(yōu)化主要從三個(gè)方面入手:
1豆巨、提前計(jì)算并緩存好高度(布局),因?yàn)閔eightForRowAtIndexPath:是調(diào)用最頻繁的方法掐场;
2往扔、異步繪制,遇到復(fù)雜界面熊户,遇到性能瓶頸時(shí)萍膛,可能就是突破口;
3嚷堡、滑動時(shí)按需加載蝗罗,這個(gè)在大量圖片展示,網(wǎng)絡(luò)加載的時(shí)候很管用r蚪洹(SDWebImage已經(jīng)實(shí)現(xiàn)異步加載串塑,配合這條性能杠杠的)。
除了上面最主要的三個(gè)方面外北苟,還有很多幾乎大伙都很熟知的優(yōu)化點(diǎn):
1桩匪、正確使用reuseIdentifier來重用Cells
2、盡量使所有的view opaque友鼻,包括Cell自身
3傻昙、盡量少用或不用透明圖層
4瑟慈、如果Cell內(nèi)現(xiàn)實(shí)的內(nèi)容來自web,使用異步加載屋匕,緩存請求結(jié)果
5葛碧、減少subviews的數(shù)量
6、在heightForRowAtIndexPath:中盡量不使用cellForRowAtIndexPath:过吻,如果你需要用到它进泼,只用一次然后緩存結(jié)果
7、盡量少用addView給Cell動態(tài)添加View纤虽,可以初始化時(shí)就添加乳绕,然后通過hide來控制是否顯示
說明:
本文是從網(wǎng)上摘抄下來的,供本人學(xué)習(xí)使用