1. 程式人生 > >iOS-TableView重用原理和註意點

iOS-TableView重用原理和註意點

就會 view重用 完全 次數 tableview table AR not 避免

什麽是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數的次數。

註意點:#

  1. 重取出來的cell是有可能已經捆綁過數據或者加過子視圖的,如果有必要,要清除需要用與顯示的數據和remove掉add過的子視圖。

  2. 原理就是為了避免頻繁的alloc和delloc cell對象。

  3. 設計的關鍵是實現cell和數據的完全分離。

解決辦法:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
//改為以下的方法  
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

所以整個過程並不難理解,但需要註意正是因為這樣的原因:配置cell的時候一定要註意,對取出的重用的cell做重新賦值,不要遺留老數據。


使用過程中,我註意到,並不是只有拖動超出屏幕的時候才會更新reusableTableCells表,還有:

  1. reloadData,這種情況比較特殊。一般是部分數據發生變化,需要重新刷新cell顯示的內容時調用。在cellForRowAtIndexPath調用中,所有cell都是重用的。
    reloadData調用後,把visibleCells(當前顯示cell)中所有cell移入到reusableTableCells中,然後把visibleCells清空。
    cellForRowAtIndexPath調用後,再把重用的cell從reusableTableCells取出來,放入到visibleCells。

  2. reloadRowsAtIndex,刷新指定的IndexPath。如果調用時reusableTableCells為空,那麽cellForRowAtIndexPath調用後,是新創建cell,新的cell加入到visibleCells。老的cell移出visibleCells,加入到reusableTableCells。於是,之後的刷新就有cell做重用了。



鏈接:https://www.jianshu.com/p/7fb91f1ce3a5



iOS-TableView重用原理和註意點