在存在dequeueReusableCellWithIdentifier疑问的情况下跟踪UITableViewCell指针

时间:2015-05-05 17:23:10

标签: ios objective-c uitableview

假设我使用以下样板代码cellForRowAtIndexPath方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  

    static NSString *CellIdentifier = @"Cell";  

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
    if (cell == nil) {  
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];  
    }  

    // Set up the cell...  
    cell.textLabel.text = [some_array objectAtIndex:indexPath.row];

    //Track the cell
    self.track_Cell = cell ; //<------<<----<<----Suppose I do something like this
    return cell;  
}  

现在假设我的班级有以下属性

@property(strong , nonatomic) UITableViewCell* track_Cell;

现在我读到如果我将在UITableview中显示的数组总共有10个项目且UITableview可见显示只能显示5行,那么在这种情况下只有所需的可见{ {1}} +2将被创建。所以在这种情况下只会创建七个。 (我从here读到)。我也理解使用UITableViewCell的好处是回收已创建的dequeueReusableCellWithIdentifier:CellIdentifier。如果UITableViewCell不在视图中,那么它将被回收。例如,如果第10行不在视图中,那么用于显示第10行的相同UITableViewCell可能会用于显示第3行(如果我错了,请纠正我)。说完我的问题是:

使用以下语句(我在代码中使用过)是危险的。特别是考虑到我的表通过附加到不同的NSMutableArray进行过滤

UITableviewCell*

我之所以感到危险是因为我假设我有一个 track_Cell = cell ; 来显示索引为2的数组中的数据。现在,因为UITableviewCell*被回收,所以可能有可能同样的UITableviewCells*可能指向该数组中的索引9而不是索引2.因此,假设它总是指向第二行,将指针保存到UITableviewCell是错误的。如果我的理解是错误的,请纠正我。

1 个答案:

答案 0 :(得分:1)

尽量坚持indexPath而不是细胞本身。在任何时候,您都可以通过调用cellForRowAtIndexPath:来获取表示该indexPath的单元格。

您对表格视图单元格回收的理解是正确的,相同的单元格可能在时间t = 0表示indexPath 0-0,但可能在时间t = 5时,它可能代表indexPath 0- 5。