iOS-TableView重用原理和註意點
什麽是cell的重用?#
重用機制,簡單的說意思是一行一行cell的復用
為什麽要實現重用?#
為了做到顯示和數據分離, 通過重用單元格來達到節省內存的目的(一個屏幕顯示的cell數量是有限的,當屏幕滾動時候,就會調用方法獲取新出現的cell,而有的cell會滾動到屏幕外面)。
如何實現 cell的重用?#
通過 UITableView的“dequeueReusableCellWithIdentifier”函數來實現,從字面上理解是“出列的可重用的cell”,其實簡單說就是一個cell池,裏面放的就是你之前創建過的cell。
重用機制的實現原理?#
UITableView頭文件,有visibleCells和reusableTableCells,visibleCells內保存當前顯示的cells,reusableTableCells保存可重用的cells。
TableView顯示之初,reusableTableCells為空,
那麽tableView dequeueReusableCellWithIdentifier: 返回nil。
開始的cell都是通過[[UITableViewCell alloc] initWithStyle: reuseIdentifier: ]來創建,而且cellForRowAtIndexPath只是調用最大顯示cell數的次數。
註意點:#
-
重取出來的cell是有可能已經捆綁過數據或者加過子視圖的,如果有必要,要清除需要用與顯示的數據和remove掉add過的子視圖。
-
原理就是為了避免頻繁的alloc和delloc cell對象。
-
設計的關鍵是實現cell和數據的完全分離。
解決辦法:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//改為以下的方法
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
所以整個過程並不難理解,但需要註意正是因為這樣的原因:配置cell的時候一定要註意,對取出的重用的cell做重新賦值,不要遺留老數據。
使用過程中,我註意到,並不是只有拖動超出屏幕的時候才會更新reusableTableCells表,還有:
-
reloadData,這種情況比較特殊。一般是部分數據發生變化,需要重新刷新cell顯示的內容時調用。在cellForRowAtIndexPath調用中,所有cell都是重用的。
reloadData調用後,把visibleCells(當前顯示cell)中所有cell移入到reusableTableCells中,然後把visibleCells清空。
cellForRowAtIndexPath調用後,再把重用的cell從reusableTableCells取出來,放入到visibleCells。 -
reloadRowsAtIndex,刷新指定的IndexPath。如果調用時reusableTableCells為空,那麽cellForRowAtIndexPath調用後,是新創建cell,新的cell加入到visibleCells。老的cell移出visibleCells,加入到reusableTableCells。於是,之後的刷新就有cell做重用了。
鏈接:https://www.jianshu.com/p/7fb91f1ce3a5
iOS-TableView重用原理和註意點