UITableView的復(fù)用機(jī)制以及優(yōu)化

一诱咏、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í)使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逼纸,一起剝皮案震驚了整個(gè)濱河市洋措,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杰刽,老刑警劉巖菠发,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贺嫂,居然都是意外死亡滓鸠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門第喳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糜俗,“玉大人,你說我怎么就攤上這事曲饱∮颇ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵扩淀,是天一觀的道長楔敌。 經(jīng)常有香客問我,道長引矩,這世上最難降的妖魔是什么梁丘? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮旺韭,結(jié)果婚禮上氛谜,老公的妹妹穿的比我還像新娘。我一直安慰自己区端,他們只是感情好值漫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著织盼,像睡著了一般杨何。 火紅的嫁衣襯著肌膚如雪酱塔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天危虱,我揣著相機(jī)與錄音羊娃,去河邊找鬼。 笑死埃跷,一個(gè)胖子當(dāng)著我的面吹牛蕊玷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弥雹,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼垃帅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剪勿?” 一聲冷哼從身側(cè)響起贸诚,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厕吉,沒想到半個(gè)月后酱固,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赴涵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年媒怯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了订讼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片髓窜。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖欺殿,靈堂內(nèi)的尸體忽然破棺而出寄纵,到底是詐尸還是另有隱情,我是刑警寧澤脖苏,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布程拭,位于F島的核電站,受9級特大地震影響棍潘,放射性物質(zhì)發(fā)生泄漏恃鞋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一亦歉、第九天 我趴在偏房一處隱蔽的房頂上張望恤浪。 院中可真熱鬧,春花似錦肴楷、人聲如沸水由。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砂客。三九已至泥张,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鞠值,已是汗流浹背媚创。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彤恶,地道東北人筝野。 一個(gè)月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像粤剧,于是被迫代替她去往敵國和親歇竟。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容