iOS開發之Cell重用機制理解
一、UITableView的一些瞭解
代理方法中的 dequeueResableCellWithIdentifier方法,對table view的資料進行繫結,即填充cell,自動呼叫n次
UITableView的每一行都是一個UITableViewCell,通過dataSource的 tableView:cellForRowAtIndexPath:方法來初始化每⼀行。
二、cell的重用原理
每一個UITableView裡都維護著一個cell佇列,當UITableView剛載入的時候,cell佇列裡是沒有任何資料的。dequeueResableCellWithIdentifier從字面上理解就是”出列可重用的cell",也就是根據一個標識identifier從cell佇列裡取出一個UITableViewCell,當然了,如果cell佇列裡沒有此標識的cell,呼叫此方法的結果就是返回nil。因此,在UITableView剛載入的時候,cell佇列裡沒有可用的cell,所以必須通過語句
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
來建立對應CellIdentifier標識的UITableViewCell例項。
[tableView:cellForRowAtIndexPath:方法主要是根據nsindex取得一個cell ]
而當UITableView在滾動的時候導致UITableViewCell滾出手機螢幕檢視的時候,程式會將這一個UITalbeViewCell例項放入此UITableView所維護的cell佇列中。當UITableview中有新的UITableViewCell需要展現在手機螢幕檢視上時,就會呼叫tableView:cellForRowAtIndexPath:方法了。
也就是說:
重⽤原理:當滾動列表時,部分UITableViewCell會移出視窗,UITableView會將視窗外的UITableViewCell放入一個物件池中,等待重用。當UITableView要求dataSource返回 UITableViewCell時,dataSource會先檢視這個物件池,如果池中有未使用的 UITableViewCell,dataSource則會用新的資料來配置這個UITableViewCell,然後返回給 UITableView,重新顯示到視窗中,從而避免建立新物件 。這樣可以讓建立的cell的數量維持在很低的水平,如果一個視窗中只能顯示5個cell,那麼cell重用之後,只需要建立6個cell就夠了。
快取優化的思路:
(1)先去快取池中查詢是否有滿足條件的cell,若有那就直接拿來
(2)若沒有,就自己建立一個cell
(3)建立cell,並且設定一個唯一的標記(把屬於“”的給蓋個章)
(4)給cell設定資料
如果不想重用UITableViewCell例項,如在一個每一行都顯示不同內容的UITableView例項時,我們可以用如下的方法:
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row];
來重新定義標識。
這樣每一行都有其對應的identifier,從cell佇列裡取出來只有兩個結果:
1-cell佇列裡沒有此identifier對應的UITableViewCell例項,返回nil
2-cell佇列裡有此identifier對應的UITableViewCell例項,而且不會有重用到其他不同行的cell的情況