1

我有一个带有 9 个单元格的简单 UITableView。当我通过滚动上下移动表格时,我得到 EXE 错误访问。NSZombieMode 指向 cellForRowAtIndexMethod。

- (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];
}

cell.textLabel.text = [lineArray objectAtIndex:indexPath.row];
cell.accessoryType =  UITableViewCellAccessoryDisclosureIndicator;

return cell;
}

谁能提出什么问题?

4

3 回答 3

1

如果 ARC 被禁用,则autorelease在创建时添加cell

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier] autorelease];

这可能是泄漏的原因。还要检查一下lineArray,因为它像 ivar 一样使用,并且可能这个数组在某个时候发布了。

于 2012-09-01T19:41:27.707 回答
1

我的猜测是您正在尝试访问lineArray超出范围的元素。

IE:indexPath.row当您的lineArray.

当您向下滚动时会发生这种情况,因为它会触发cellForRowAtIndexPath在更高数量的行上被调用(例如 indexPath.row > 3 的行)

我会再走一步,猜测您可能正在静态返回numberOfRowsForSection

将其设置为lineArray.count应该修复它。

于 2012-09-01T19:46:41.837 回答
0

根据我的理解:-

1)在lineArray中你有大约9个项目,但在numberOfRowsInSection中你返回的rowCount比数组中的项目多,因此它崩溃并指向ceelForRowAtIndex。

2)这是供您理解的示例代码:-

- (void)viewDidLoad
{
    [super viewDidLoad];
    lineArray = [[NSMutableArray alloc]initWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
    tableView1 = [[UITableView alloc]init];
    tableView1.delegate = self;
    tableView1.dataSource = self;
    tableView1 .frame =self.view.frame;
    [self.view addSubview:tableView1];

}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return  [lineArray count];

    //return ;
}


- (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];
    }

    cell.textLabel.text = [lineArray objectAtIndex:indexPath.row];
    cell.accessoryType =  UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

}
于 2012-11-27T05:10:14.857 回答