UITableViewCell重用機制
UITableView是iOS開發中使用頻率非常高的一個控制元件,它常被用來展示資訊列表,雖然資訊資料可能很多,但UITableView消耗的資源卻並不會隨著展示資訊的增多而變大,這都要得益於UITableViewCell的重用機制,重用機制:顧名思義,就是重複利用資源的機制。下面通過一些程式碼來看下通常我們建立UITableViewCell的方式
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
static NSString *cellIdentifier =@"NormalCell";
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier: cellIdentifier];
if (!cell) {
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier: cellIdentifier];
}
//處理邏輯
return cell;
}
如上所示,通常我們會呼叫UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];語句來獲取標識為@"NormalCell"的可重用的cell,如果有標識為@"NormalCell"的cell,則返回一個cell;否則返回nil。若上面語句的返回值為nil,我們就需要建立一個新cell。上面這種獲取cell的方式即是UITableViewCell的重用機制。舉個形象例子:當前的UITableView一次最多可顯示8個cell,我們有100個cell需要顯示出來,那麼當UITableView初始化時顯示的是1-8的cell,這時候沒有可重用的cell,所以每個cell都需要新建,當我們把UITableView向上拖動,這時候第1個cell尚未完全離開可見檢視,第9個cell需要顯示部分,這時也是沒有可重用的cell,所以第9個cell也是需要新建的,當第1個cell完全離開可見檢視後即被回收回去標記為可重用,現在當需要顯示第10個cell時即可獲取到可重用的cell,所以第10個cell是不需要新建的,它使用的即是被回收的第1個cell,後面的以此類推,所以展示100個cell只需要新建9個cell就可以了。
結合網路資料及iOS的SDK可以推測UITableViewCell的重用機制是這樣實現的:
在UITableView中應該有一個可變字典來儲存可重用的cell:NSMutableDictionary*reusableTableCells;在UITableView剛初始化的時候reusableTableCells中的內容為空,當有cell離開可見檢視時,系統就會根據cell的可重用標識把cell儲存到reusableTableCells中,實現方式類似如下程式碼:
-(void)addReusebleCell:(UITableViewCell *)cell
{
NSString *reuseIdentifier =cell.reuseIdentifier;
NSMutableSet *reuseCellSet = [reusableTableCellsobjectForKey:reuseIdentifier];
if (!reuseCellSet) {
reuseCellSet = [[NSMutableSetalloc]init];
}
[reuseCellSet addObject:cell];
[reusableTableCells setObject:reuseCellSetforKey:reuseIdentifier];
}
獲取可重用cell的方法- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier的實現方式類似如下程式碼:
-(id)dequeueReusableCellWithIdentifier:(NSString *)identifier
{
NSMutableSet *reuseCellSet =[reusableTableCells objectForKey:identifier];
if (reuseCellSet.count == 0) {
return nil;
}
id anyObject = [reuseCellSet anyObject];
[reuseCellSet removeObject:anyObject];
return anyObject;
}
至此,UITableViewCell的重用機制的講解完畢。
相關文章
- ios基礎之UITableViewCell的重用(帶示例原創)iOSUIView
- iOS開發-UITableView的重用機制iOSUIView
- Rational Functional Tester 中可重用的物件識別機制Function物件
- UITableViewCell 自動高度UIView
- UITableViewCell的高度快取UIView快取
- HDFS 02 - HDFS 的機制:副本機制、機架感知機制、負載均衡機制負載
- UITableViewCell分割線位置調整UIView
- iOS UITableViewCell的動畫效果(一)iOSUIView動畫
- OC UITableviewCell的優雅newUIView
- session機制和cookie機制SessionCookie
- 重用其他程式庫
- 實現 UITableViewCell 側滑操作列表UIView
- UITableViewCell自適應圖片高度UIView
- 實現 UITableViewCell的批量刪除UIView
- Oracle with重用子查詢Oracle
- OBJECT_ID的重用Object
- 【IOS初學者】UITableView與自定義UITableViewCelliOSUIView
- iOS-UITableViewCell的一些事iOSUIView
- 取消特定UITableViewCell、UITableHeaderFooterView的分割線UIViewHeader
- iOS開發之有間距的UITableViewCelliOSUIView
- 自定義UIView UITableViewCell等控制元件UIView控制元件
- 快速失敗機制&失敗安全機制
- JavaScript執行緒機制與事件機制JavaScript執行緒事件
- 模組機制
- Binder機制
- session機制Session
- 管理機制
- 淺談JS事件機制與React事件機制JS事件React
- OC訊息機制,訊息轉發機制
- 終端優化機制:墓碑機制和Doze優化
- golang slice 和 string 重用Golang
- OBJECT_ID的重用(二)Object
- iOS AutoLayout進階(五)UITableViewCell自動高度iOSUIView
- 巢狀UITextView的UITableViewCell高度自適應巢狀UITextView
- iOS UITableViewCell允許滑動的處理iOSUIView
- iOS11 UITableViewCell滑動事件改動iOSUIView事件
- 小程式技術科普:執行機制&安全機制
- 響應式流的核心機制——背壓機制