i ios
裝置的記憶體有限,如果用
uitableview
顯示成千上萬條資料,就需要成千上萬個
uitableviewcell
物件的話,那將會耗盡
ios裝置的記憶體。要解決該問題,需要重用
uitableviewcell物件
n重用原理
:當滾動列表時,部分
uitableviewcell
會移出視窗,
uitableview
會將視窗外的
uitableviewcell
放入乙個物件池中,等待重用。當
uitableview
要求datasource
返回uitableviewcell
時,datasource
會先檢視這個物件池,如果池中有未使用的
uitableviewcell
,datasource
會用新的資料配置這個
uitableviewcell
,然後返回給
uitableview
,重新顯示到視窗中,從而避免建立新物件
n還有乙個非常重要的問題
:有時候需要自定義
uitableviewcell(
用乙個子類繼承
uitableviewcell)
,而且每一行用的不一定是同一種
uitableviewcell
,所以乙個
uitableview
可能擁有不同型別的
uitableviewcell
,物件池中也會有很多不同型別的
uitableviewcell
,那麼uitableview
在重用uitableviewcell
時可能會得到錯誤型別的
uitableviewcell
n解決方案
:uitableviewcell
有個nsstring
*reuseidentifier
屬性,可以在初始化
uitableviewcell
的時候傳入乙個特定的字串標識來設定
reuseidentifier(
一般用uitableviewcell
的類名)
。當uitableview
要求datasource
返回uitableviewcell
時,先通過乙個字串標識到物件池中查詢對應型別的
uitableviewcell
物件,如果有,就重用,如果沒有,就傳入這個字串標識來初始化乙個
uitableviewcell物件
cell
的重用**
- (uitableviewcell
*)tableview:(
uitableview
*)tableview cellforrowatindexpath:(
nsindexpath
*)indexpath
// 4.
設定cell
的屬性...
//記憶體中開闢空間,耗效能
// static
修飾區域性變數,可以保證區域性變數值分配一次記憶體空間
(只初始化一次)//
不使用巨集,因為只有這乙個方法裡面要使用這個變數,不希望外部能夠使用到
static
nsstring
*cellid =
@"hero"
;// 1.
首先通過
@「a」
標示符去快取池裡找有沒有可以迴圈利用的
cell
uitableviewcell
*cell = [tableview
dequeuereusablecellwithidentifier
:cellid];
// 2.
如果找不到可以利用的
cell
,就建立
if(cell ==
nil)
cell重用機制
對於程式而言,記憶體控制是必不可少的。如果乙個tableview中有1000個cell,乙個個建立的話會消耗很大的記憶體,很容易出現記憶體報警,cell的重用機制就是為了節省記憶體的一種機制。只建立螢幕能顯示的最大個數的cell,然後重複使用這些cell,對cell進行單獨的顯示分配,這樣既不影響顯...
cell的重用機制
ios開發ui篇 uitableviewcell的效能問題 一 uitableviewcell的一些介紹 uitableview的每一行都是乙個uitableviewcell,通過datasource的 tableview cellforrowatindexpath 方法來初始化每 行 uitabl...
iOS tableView可重用cell的兩個方法
dequeuereusablecellwithidentifier dequeuereusablecellwithidentifier forindexpath 這兩個方法的區別總結下。storyboard自定義cell 如果使用 storyboard 並且,在 storyboard 中指定了 單元...