Monday 17 June 2013

iOS TableView Part I Cell Reused.

1.  我们为什么要重用cell?
 答案很简单,就是performance的原因。
 每次当我们滑动的时候,遇到未知的位置,我们就需要找到个cell来填充,这时候我们可以选  择创建个cell出来,然后把需要的信息填进cell,这样的坏处是什么呢?
Object allocation 是一个非常消耗效率和时间的事,而且特别在一个很短周期内重复地alloc Object。所以这时候当我们scroll table view的时候,我们就可以利用已经被划出屏幕的cell, 重用这些cell,并不是重新创建cell, 这样我们就大大地提高了我们 table view的效率。

2. 重用cell的原理

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    static NSInteger count = 0;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier ];
    if (cell == nil) {
        cell = [[UITableViewCell allocinitWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        count++;
        NSLog(@"%d", count);
    }
    
    cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];
    
    return cell;
}



so 大家可以理解的是,当我们启动程序的时候,我们创建了这一屏幕个数的cell, 就是11个cell,
然后等我们滑动一下,第12个cell被创建了,我们继续滑动,就没有然后了,创建cell的数量就停在12个上面。

通过上面的现象我们就可以理解到cell,  当我们创建了tableview 和 加载第一屏的cell时候,我们就创建了一个内部的队列用来管理可以重用的cell, 像上图一样,当我们滑动出row11时候,这时候我们的重用队列里面没有可以重用的cell, 我们就只有重新再创建一个cell出来,然后把已经移除屏幕的cell 0加进我们的重用队列里面去。然后我们继续滑动出row 12的时候,这时候我们去查看我们的重用队列,发现里面有可以重用的cell 0, 这时候我们就把cell 0 重用来作为cell 12, 这样就完成了,我们对cell 的重用。

为了验证我们的结论,就让我们来调试一下代码,看看是怎么回事吧,
所以我们在tableView:cellForRowAtIndexPath: 每次创建cell的时候打上断点,然后我们发现cell 0 被创建出来了,address是 0x0f608530,  这时候我们发现了tableview 里面有个成员叫做
_reusableTableCells的dictionary, 为什么是个dictionary, 因为我们可能有多种 cell identifier 可能需要重用。当我们没有滑动时候,这时候_reusableTableCells没有key.

当我们滑动时候,这时候tableView:cellForRowAtIndexPath: 又被调用,这时候_reusableTableCells 里面还是没有可以重用的,所以我们只能再创建出cell 11来,当第0个cell 被完全移除屏幕的时候,这时候我们的_reusableTableCells 把cell 0 加进来,当我们滑动出cell 12的时候,我们就可以发现,这时候我们_reusableTableCells里面有东西了,然后我们通过dequeueReusableCellWithIdentifier 把它取出来时,这话cell的地址就就是我们cell 0, 0x0f608530.
这就是iOS tableView 重用cell的原理。












No comments:

Post a Comment