UITableView作為在項(xiàng)目中最常用控件之一,對于開發(fā)人員而言特別重要,基本上哪個App都用到了tableView,于是,理解tableView的重用機(jī)制對于iOS開發(fā)人員來說很重要,
首先tableView為什么需要重用機(jī)制呢?我們來舉個例子,假如一個tableView需要加載N行cell,那就需要創(chuàng)建N個cell來進(jìn)行顯示,可是作為用戶我們只能看到手機(jī)屏幕中那僅有的幾個cell,滑動的時(shí)候才能看到更多的cell,于是我們?nèi)绻麆?chuàng)建N個cell的話,就會造成內(nèi)存的損失。為了優(yōu)化這種內(nèi)存損失,重用機(jī)制應(yīng)運(yùn)而生,即我們不需要創(chuàng)建N個cell,不要一次性加載那么多的cell,而只加載屏幕上所顯示的cell,當(dāng)監(jiān)聽到用戶滑動的時(shí)候,離開屏幕的cell可以存儲起來,便于下次賦值顯示,而不是直接銷毀再重新創(chuàng)建.
重用機(jī)制實(shí)現(xiàn)了數(shù)據(jù)和顯示的分離,并不為每個數(shù)據(jù)創(chuàng)建一個UITableViewCell,我們只創(chuàng)建屏幕可顯示的最大的cell個數(shù)+1,然后去循環(huán)重復(fù)利用這些cell,既節(jié)省空間,又達(dá)到我們需要顯示的效果.
這種機(jī)制下系統(tǒng)默認(rèn)有一個可變數(shù)組NSMutableArray*? visiableCells,用來保存當(dāng)前顯示的cell.一個可變字典NSMutableDictnery* reusableTableCells,用來保存可重復(fù)利用的cell.(之所以用字典是因?yàn)榭芍赜玫腸ell有不止一種樣式,我們需要根據(jù)它的reuseIdentifier,也就是所謂的重用標(biāo)示符來查找是否有可重用的該樣式的cell),用以一一對應(yīng).
如代碼所示:
首先,從重用隊(duì)列中reusableTableCells字典中取出cell(這一步是根據(jù)reuseIdentify標(biāo)識作為鍵去字典中取出這個類型的cell),假如沒取到,說明重用字典(隊(duì)列)中沒有reuseIdetify這種類型的cell,那么就創(chuàng)建一個這種類型的cell,當(dāng)監(jiān)聽cell在屏幕中的時(shí)候,就講其放入visibleCells中去,當(dāng)監(jiān)聽到cell離開屏幕的時(shí)候,就將其存入reusableTableCells中去(相當(dāng)于 [reusableTableCells setValue:cell? forKey:reuesIdentifier]),這樣可以達(dá)到重復(fù)創(chuàng)建一種類型的cell,類似于一種緩存機(jī)制。
作者:mrChan1234