今天來(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ī)制可以類比為傳送帶模型,如下圖所示:
假設(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)文檔摔握。
- cellForRowAtIndexPath寄狼。這是最常用的一種方法,也是遵循UITableViewDataSource協(xié)議時(shí)必須實(shí)現(xiàn)的方法氨淌。一般在這里對(duì)cell內(nèi)部的各個(gè)組件進(jìn)行數(shù)據(jù)配置例嘱。
- prepareForReuse。這個(gè)方法在dequeueReusableCellWithIdentifier返回cell前調(diào)用宁舰。一般在這里對(duì)cell的非content屬性進(jìn)行配置(如:editing、selection屬性等)奢浑。
- 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ì)你有所幫助_莺丑。