什么是cell的重用?#
重用機(jī)制算行,簡單的說意思是一行一行cell的復(fù)用
為什么要實(shí)現(xiàn)重用呈驶?#
為了做到顯示和數(shù)據(jù)分離, 通過重用單元格來達(dá)到節(jié)省內(nèi)存的目的(一個(gè)屏幕顯示的cell數(shù)量是有限的碘梢,當(dāng)屏幕滾動(dòng)時(shí)候咬摇,就會(huì)調(diào)用方法獲取新出現(xiàn)的cell,而有的cell會(huì)滾動(dòng)到屏幕外面)煞躬。
如何實(shí)現(xiàn) cell的重用肛鹏?#
通過 UITableView的“dequeueReusableCellWithIdentifier”函數(shù)來實(shí)現(xiàn),從字面上理解是“出列的可重用的cell”恩沛,其實(shí)簡單說就是一個(gè)cell池在扰,里面放的就是你之前創(chuàng)建過的cell。
重用機(jī)制的實(shí)現(xiàn)原理复唤?#
UITableView頭文件健田,有visibleCells和reusableTableCells,visibleCells內(nèi)保存當(dāng)前顯示的cells佛纫,reusableTableCells保存可重用的cells妓局。
TableView顯示之初,reusableTableCells為空呈宇,
那么tableView dequeueReusableCellWithIdentifier: 返回nil好爬。
開始的cell都是通過[[UITableViewCell alloc] initWithStyle: reuseIdentifier: ]來創(chuàng)建,而且cellForRowAtIndexPath只是調(diào)用最大顯示cell數(shù)的次數(shù)甥啄。
注意點(diǎn):#
重取出來的cell是有可能已經(jīng)捆綁過數(shù)據(jù)或者加過子視圖的存炮,如果有必要,要清除需要用與顯示的數(shù)據(jù)和remove掉add過的子視圖。
原理就是為了避免頻繁的alloc和delloc cell對(duì)象穆桂。
設(shè)計(jì)的關(guān)鍵是實(shí)現(xiàn)cell和數(shù)據(jù)的完全分離宫盔。
解決辦法:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//改為以下的方法
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
所以整個(gè)過程并不難理解,但需要注意正是因?yàn)檫@樣的原因:配置cell的時(shí)候一定要注意享完,對(duì)取出的重用的cell做重新賦值灼芭,不要遺留老數(shù)據(jù)。
使用過程中般又,我注意到彼绷,并不是只有拖動(dòng)超出屏幕的時(shí)候才會(huì)更新reusableTableCells表,還有:
reloadData茴迁,這種情況比較特殊寄悯。一般是部分?jǐn)?shù)據(jù)發(fā)生變化,需要重新刷新cell顯示的內(nèi)容時(shí)調(diào)用堕义。在cellForRowAtIndexPath調(diào)用中猜旬,所有cell都是重用的。
reloadData調(diào)用后胳螟,把visibleCells(當(dāng)前顯示cell)中所有cell移入到reusableTableCells中昔馋,然后把visibleCells清空。
cellForRowAtIndexPath調(diào)用后糖耸,再把重用的cell從reusableTableCells取出來秘遏,放入到visibleCells。reloadRowsAtIndex嘉竟,刷新指定的IndexPath邦危。如果調(diào)用時(shí)reusableTableCells為空,那么cellForRowAtIndexPath調(diào)用后舍扰,是新創(chuàng)建cell倦蚪,新的cell加入到visibleCells。老的cell移出visibleCells边苹,加入到reusableTableCells陵且。于是,之后的刷新就有cell做重用了个束。