我有一些(我认为)非常基本的代码,用于从数据源创建单元格内容,并且在显示加载时一切正常。但是,当我开始滚动查看其他文本(向上或向下)时,代码将失败并显示'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。如果它跳过,这意味着该单元格包含与第一次创建时相同的内容,对吧?为什么给我带来麻烦?
答案 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)”块中(这更有意义),并且它工作正常。我希望我明白了什么是错的,但无论如何,谢谢你的答案!