前言
UITableView可以說是iOS開發(fā)中最為常用、最為重要的一個控件,相信每個iOS開發(fā)者對他都不會陌生,但是你真正了解它的工作原理了嗎?下面讓我們來了解下UITableView的重用機制。
為什么要用重用機制
眾所周知,UITableView是可以滾動的一個控件,當UITableView回滾時,如果不用重用機制會重復初始化原來已初始化的cell,所以用重用機制會節(jié)省性能,避免出現(xiàn)一些因為網(wǎng)絡因素而造成的卡頓現(xiàn)象。
UITableView重用機制的原理
重用機制主要用到了一個可變數(shù)組visiableCells和一個可變的字典類型reusableTableCells,其中visiableCells用來存儲當前UITableView顯示的cell,reusableTableCells用來存儲已經(jīng)用'identify'緩存的cell。當UITableView滾動的時候,會先在reusableTableCells中根據(jù)identify找是否有有已經(jīng)緩存的cell,如果有直接用,沒有再去初始化。
UITableView重用的幾種寫法
1
static NSString *cellID = @"cell";
//根據(jù)identify在緩存的字典中找是否有已經(jīng)初始化好的cell
UITableView *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
cell = [[HORTransitReportCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:cellID];
}
return cell;
2 注冊的方式
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier: identifier] ;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 重用隊列中取單元格 由于上面已經(jīng)注冊過單元格,系統(tǒng)會幫我們做判斷,不用再次手動判斷單元格是否存在
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: identifier forIndexPath:indexPath] ;
return cell ;
}
這種方式的原理和前一種類似,先注冊一個類(也就是告訴編譯器這個類可能是我們即將要用來初始化的類)然后根據(jù)identify去緩存字典中找是否有這個cell,如果沒有的話判斷初始化類和注冊類符不符合,如果相符就初始化一個新的cell.
特殊情況
有的時候我們會遇到每個cell都大致相同,但是又有細微變化,會讓每個cell都單獨一個而不互相復用,這時候我們可以指定每個cell的identify這樣就不會變了。
static NSString *cellID = [NSString format@"cell%ld%ld",indexPath.section,indexPath.row];
//根據(jù)identify在緩存的字典中找是否有已經(jīng)初始化好的cell
UITableView *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
cell = [[HORTransitReportCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:cellID];
}
return cell;