引入if()时未使用的变量

时间:2011-10-07 15:46:39

标签: objective-c ios xcode

我目前正在使用一本书学习UITableViewCell。为了在滚动时重用单元,作者要求修改原始代码以包括if()语句以检查特定重用标识符的单元是否存在。但是,在添加if()语句后,Xcode会在Unused variable 'cell'内的行上发出警告if(!cell)。运行代码时,我收到错误Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'出了什么问题?

原始代码

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

UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                                reuseIdentifier:@"UITableViewCell"] autorelease];
Possession *p = [[[PossessionStore defaultStore] allPossessions] objectAtIndex:[indexPath row]];
[[cell textLabel] setText:[p description]];

return cell;
}

修改后的代码

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Check for reusable cell first, use that if it exists
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

// If there is no reusable cell of this type, create a new one
if (!cell) {
    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                                    reuseIdentifier:@"UITableViewCell"] autorelease];
}

Possession *p = [[[PossessionStore defaultStore] allPossessions] objectAtIndex:[indexPath row]];
[[cell textLabel] setText:[p description]];

return cell;
}

1 个答案:

答案 0 :(得分:6)

我认为你必须将UITableViewCell *放在条件块中。否则,您将在块中声明一个新的cell变量并将其丢弃而不是分配给上面声明的单元格。 (编译器没有警告过你吗?)整体逻辑应该是:

UITableViewCell *cell = /* try to get a cached one */
if (cell == nil) {
    cell = /* there was no cached cell available, create a fresh one */
}
/* …more code… */
/* and finally return the created cell */
return cell;