UITableviewCell 重用記憶體

2021-09-07 04:40:39 字數 1736 閱讀 9574

檢視uitableview標頭檔案,會找到nsmutablearray*  visiablecells,和nsmutabledictnery* reusabletablecells兩個結構。visiablecells內儲存當前顯示的cells,reusabletablecells儲存可重用的cells。

tableview顯示之初,reusabletablecells為空,那麼tableview dequeuereusablecellwithidentifier:cellidentifier返回nil。開始的cell都是通過[[uitableviewcell alloc] initwithstyle:uitableviewcellstyledefault reuseidentifier:cellidentifier]來建立,而且cellforrowatindexpath只是呼叫最大顯示cell數的次數。

比如:有100條資料,iphone一屏最多顯示10個cell。程式最開始顯示tableview的情況是:

1. 用[[uitableviewcell alloc] initwithstyle:uitableviewcellstyledefault reuseidentifier:cellidentifier]建立10次cell,並給cell指定同樣的重用標識(當然,可以為不同顯示型別的cell指定不同的標識)。並且10個cell全部都加入到visiablecells陣列,reusabletablecells為空。

2. 向下拖動tableview,當cell1完全移出螢幕,並且cell11(它也是alloc出來的,原因同上)完全顯示出來的時候。cell11加入到visiablecells,cell1移出visiablecells,cell1加入到reusabletablecells。

3. 接著向下拖動tableview,因為reusabletablecells中已經有值,所以,當需要顯示新的cell,cellforrowatindexpath再次被呼叫的時候,tableview dequeuereusablecellwithidentifier:cellidentifier,返回cell1。cell1加入到visiablecells,cell1移出reusabletablecells;cell2移出visiablecells,cell2加入到reusabletablecells。之後再需要顯示的cell就可以正常重用了。

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

一些情況

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

1. reloaddata,這種情況比較特殊。一般是部分資料發生變化,需要重新重新整理cell顯示的內容時呼叫。在cellforrowatindexpath呼叫中,所有cell都是重用的。我估計reloaddata呼叫後,把visiablecells中所有cell移入reusabletablecells,visiablecells清空。cellforrowatindexpath呼叫後,再把reuse的cell從reusabletablecells取出來,放入到visiablecells。

2. reloadrowsatindex,重新整理指定的indexpath。如果呼叫時reusabletablecells為空,那麼cellforrowatindexpath呼叫後,是新建立cell,新的cell加入到visiablecells。老的cell移出visiablecells,加入到reusabletablecells。於是,之後的重新整理就有cell做reuse了。 

計算UITableViewCell高度

uitableview是先執行 cgfloat tableview uitableview tableview heightforrowatindexpath nsindexpath indexpath函式計算整個uitableview內容高度,然後才執行 uitableviewcell table...

UITableViewCell重用問題

在寫sina 微博介面的過程中使用到了cell,那麼就是在cell上新增一些控制項,但是由於每條微博的內容都是不同的,所以在顯示的過程中,出現了內容重疊的問題,其實就是uitableviewcell重用機制的問題。cpp view plain copy uitableviewcell tablevi...

UITableViewCell重用機制

uitableview是ios開發中使用頻率非常高的乙個控制項,它常被用來展示資訊列表,儘管資訊資料可能非常多,但uitableview消耗的資源卻並不會隨著展示資訊的增多而變大,這都要得益於uitableviewcell的重用機制,重用機制 顧名思義,就是反覆利用資源的機制。以下通過一些 來看下通...