淺談iOS UITableViewController之Cell循環(huán)機(jī)制

今天來(lái)簡(jiǎn)要介紹下iOS開(kāi)發(fā)組件UITableViewController中的Cell循環(huán)機(jī)制耙箍。


前言

當(dāng)前iOS設(shè)備的內(nèi)存是有限的。當(dāng)使用Table View來(lái)展示數(shù)據(jù)時(shí)酥馍,假設(shè)行數(shù)有成千上萬(wàn)行辩昆,則一次性生成這么多的cell,顯然會(huì)帶來(lái)極大的內(nèi)存消耗旨袒。因此汁针,iOS只對(duì)即將滾動(dòng)出現(xiàn)的cell進(jìn)行“配置”术辐;并引入了對(duì)UITableViewCell的循環(huán)機(jī)制,把即將滾動(dòng)消失的cell緩存起來(lái)以循環(huán)利用施无,這樣便大大優(yōu)化了內(nèi)存管理辉词。


Cell循環(huán)的傳送帶模型

Cell的循環(huán)機(jī)制可以類比為傳送帶模型,如下圖所示:


Cell循環(huán)的傳送帶模型

假設(shè)Table View從下往上滾動(dòng)猾骡,虛線框中的是這個(gè)Table View的可見(jiàn)cell部分瑞躺。這里有2種不同類型的cell,分別記為A類和B類兴想。則此刻幢哨,可見(jiàn)cell分別是A類的a2 cell、B類的b1 cell與A類的a3 cell嫂便;已經(jīng)滾動(dòng)離開(kāi)的cell有A類的a1 cell捞镰;即將滾動(dòng)顯示的cell有B類的b2 cell、A類的a4 cell等毙替。

由于a1 cell已經(jīng)滾動(dòng)離開(kāi)了可見(jiàn)cell區(qū)岸售,則它被撤下傳送帶,放入A類的Cache Cell集合中蔚龙,為下次復(fù)用做好準(zhǔn)備冰评。

當(dāng)b2 cell要滾動(dòng)進(jìn)入可見(jiàn)cell區(qū)時(shí)(a2 cell相應(yīng)地滾動(dòng)離開(kāi),進(jìn)入cache集合)木羹,首先在B類 Cache Cell集合中尋找是否有可以復(fù)用的cell甲雅,結(jié)果是沒(méi)有找到,則根據(jù)cell的identifier和cell模板新創(chuàng)建一個(gè)B類cell坑填,進(jìn)行數(shù)據(jù)配置抛人,然后隨著傳送帶滾動(dòng)進(jìn)入可見(jiàn)cell區(qū)。

當(dāng)a4 cell要滾動(dòng)進(jìn)入可見(jiàn)cell區(qū)時(shí)脐瑰,首先在A類 Cache Cell集合中尋找是否有可以復(fù)用的cell妖枚,由于之前a1、a2 cell已經(jīng)進(jìn)入了該集合苍在,故a4 cell可以復(fù)用之前已經(jīng)創(chuàng)建的cell绝页,而不需要額外創(chuàng)建新的cell。對(duì)獲得的cell進(jìn)行數(shù)據(jù)配置寂恬,然后傳動(dòng)帶將該cell送入可見(jiàn)cell區(qū)续誉。


獲取cell:dequeueReusableCellWithIdentifier

iOS在內(nèi)部實(shí)現(xiàn)了傳送帶模型,我們只需調(diào)用UITableView的下列api初肉,就能獲取一個(gè)或是新建酷鸦,或是復(fù)用的cell:

@available(iOS 6.0, *)
public func dequeueReusableCellWithIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath) -> UITableViewCell 

public func dequeueReusableCellWithIdentifier(identifier: String) -> UITableViewCell?

對(duì)cell進(jìn)行配置

在獲取cell后,一般需要對(duì)cell的content進(jìn)行配置,然后將配置后的cell展示出來(lái)臼隔。有以下3種方法能夠?qū)ell進(jìn)行content配置嘹裂,在這里大概提下,具體可以查看官網(wǎng)文檔摔握。

  1. cellForRowAtIndexPath寄狼。這是最常用的一種方法,也是遵循UITableViewDataSource協(xié)議時(shí)必須實(shí)現(xiàn)的方法氨淌。一般在這里對(duì)cell內(nèi)部的各個(gè)組件進(jìn)行數(shù)據(jù)配置例嘱。
  2. prepareForReuse。這個(gè)方法在dequeueReusableCellWithIdentifier返回cell前調(diào)用宁舰。一般在這里對(duì)cell的非content屬性進(jìn)行配置(如:editing、selection屬性等)奢浑。
  3. willDisplayCell:forRowAtIndexPath蛮艰。這個(gè)方法在cellForRowAtIndexPath之后調(diào)用,也是cell在顯示在屏幕前的最后一步能夠進(jìn)行修改的地方雀彼。一般在這里對(duì)cell進(jìn)行狀態(tài)改變信息的配置(如:selection屬性壤蚜、背景顏色等)。

結(jié)語(yǔ)

以上是對(duì)Table Cell循環(huán)機(jī)制的一些雜談徊哑,若有不足之處袜刷,請(qǐng)予指正。希望這篇文章對(duì)你有所幫助_莺丑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末著蟹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梢莽,更是在濱河造成了極大的恐慌萧豆,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昏名,死亡現(xiàn)場(chǎng)離奇詭異涮雷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)轻局,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門洪鸭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人仑扑,你說(shuō)我怎么就攤上這事览爵。” “怎么了夫壁?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵拾枣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)梅肤,這世上最難降的妖魔是什么司蔬? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮姨蝴,結(jié)果婚禮上俊啼,老公的妹妹穿的比我還像新娘。我一直安慰自己左医,他們只是感情好授帕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著浮梢,像睡著了一般跛十。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秕硝,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天芥映,我揣著相機(jī)與錄音,去河邊找鬼远豺。 笑死奈偏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躯护。 我是一名探鬼主播惊来,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼棺滞!你這毒婦竟也來(lái)了裁蚁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤继准,失蹤者是張志新(化名)和其女友劉穎厘擂,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锰瘸,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刽严,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了避凝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞萄。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖管削,靈堂內(nèi)的尸體忽然破棺而出倒脓,到底是詐尸還是另有隱情,我是刑警寧澤含思,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布崎弃,位于F島的核電站甘晤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏饲做。R本人自食惡果不足惜线婚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盆均。 院中可真熱鬧塞弊,春花似錦、人聲如沸泪姨。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肮砾。三九已至诀黍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仗处,已是汗流浹背蔗草。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疆柔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓镶柱,卻偏偏與公主長(zhǎng)得像旷档,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歇拆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)鞋屈、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評(píng)論 4 62
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法故觅,類相關(guān)的語(yǔ)法厂庇,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法输吏,異常的語(yǔ)法权旷,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,581評(píng)論 18 399
  • 三 說(shuō)回來(lái)就回來(lái)了,果真是一句哄騙母親的謊言贯溅。在遠(yuǎn)離故土一百多公里的E城拄氯,在一切都深感陌生、孤獨(dú)和無(wú)助的新單位它浅,我...
    遲遲癡語(yǔ)閱讀 398評(píng)論 2 5
  • #玩卡不卡·每日一抽# 每一位都可以通過(guò)這張卡片覺(jué)察自己: 1译柏、直覺(jué)他叫什么名字?黑妞 2姐霍、他幾歲了鄙麦? 8歲 3典唇、...
    天音思語(yǔ)閱讀 143評(píng)論 0 0
  • 初識(shí)Core Data “一個(gè)龐然大物,膚色黝黑胯府,面無(wú)表情介衔,應(yīng)該不好相處∶私伲”這是Core Data給我的第一印象夜牡。...
    莮亾閱讀 185評(píng)論 0 0