单元格开始在视图中向后滚动时出现“EXC_BAD_ACCESS”错误?

时间:2009-07-18 20:58:05

标签: objective-c iphone exception

我有一些(我认为)非常基本的代码,用于从数据源创建单元格内容,并且在显示加载时一切正常。但是,当我开始滚动查看其他文本(向上或向下)时,代码将失败并显示'GDB:程序接收信号:“EXEC_BAD_ACCESS”'。这是填写各个部分的显示的代码;每个部分都有类似的代码:

id cell = (UITableViewCell *)[tableView
    dequeueReusableCellWithIdentifier:CellIdentifier
];

titledCell = [[[TitledCell alloc]
          initWithFrame:CGRectZero
        reuseIdentifier:CellIdentifier
    ] autorelease
];

switch (tableSection) {
    case TABLE_SECTION_1:
        if (cell == nil) {
            dataKey = @"a key from data source";
            dataFromSource = [viewData objectForKey:dataKey];

            titledCell.title.text = dataKey;
            titledCell.contents.text = dataFromSource;
            cell = titledCell;
            break;
        }
    case TABLE_SECTION_2:        
    ...
}
return cell;

当我关注代码时,我注意到代码在将单元格滚动回视图时会跳过单元格创建,因为单元格!= nil。如果它跳过,这意味着该单元格包含与第一次创建时相同的内容,对吧?为什么给我带来麻烦?

4 个答案:

答案 0 :(得分:1)

我认为EXEC_BAD_ACCESS可能由以下原因引起:

titledCell.title.text = dataKey;

titledCell可能会被取消分配,并且在访问该属性时会出现EXEC_BAD_ACCESS异常。

你可以打开NSZombieEnabled env virable in:Group&文件 - > Extutables - >你的应用 - >获取信息 - >参数

答案 1 :(得分:1)

使用您提供的代码示例无法100%确定,但很好的猜测是break语句在if块中。所以看起来应该是这样的:

switch( tableSection ) {
    case TABLE_SECTION_1:
            if( cell == nil ) {
                    dataKey = @"a key from data source";
                    dataFromSource = [ viewData objectForKey:dataKey ];

                    titledCell.title.text = dataKey;
                    titledCell.contents.text = dataFromSource;
                    cell = titledCell;
            }
            break;
    case TABLE_SECTION_2:        
    ...
}

答案 2 :(得分:1)

当我忘记保留某些内容时,我通常会EXEC_BAD_ACCESS。如果你有一个autorelased对象,它可能第一次工作但第二次不工作。

使用调试运行程序并使用Xcode来确定它崩溃的行。这将比其他任何事情都更有帮助。

答案 3 :(得分:0)

不幸的是,变化使这个问题变得学术化,所以我无法确定所给出的答案是否正确。目前的代码看起来更接近于此:

 id cell = (UITableViewCell *)[tableView
      dequeueReusableCellWithIdentifier:CellIdentifier
 ];

 if (cell == nil) {
      titledCell = [[[TitledCell alloc]
                   initWithFrame:CGRectZero
                 reuseIdentifier:CellIdentifier
           ] autorelease
      ];

      switch (tableSection) {
           case TABLE_SECTION_1:
                dataKey = @"a key from data source";
                dataFromSource = [viewData objectForKey:dataKey];

                titledCell.title.text = dataKey;
                titledCell.contents.text = dataFromSource;
                cell = titledCell;
                break;
           case TABLE_SECTION_2:
           ...
 }
 return cell;

...所以大部分代码现在都在“if(cell == nil)”块中(这更有意义),并且它工作正常。我希望我明白了什么是错的,但无论如何,谢谢你的答案!