为什么第二次崩溃?

时间:2010-12-02 05:36:36

标签: iphone objective-c uitableview crash

嘿伙计们,   我是Objective-C的新手,而且我正在创建一个应用程序,当你点击一个表格单元格时它会按照它应该做的那样,但是当你第二次回到并单击该单元格时,它会崩溃“ EXC_BAD_ACCESS”。你能告诉我它意味着什么,为什么它只是第二次崩溃,我怎么能解决它?我很确定它在这个功能中:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here. Create and push another view controller.

    RaceData * data = [self.units objectAtIndex:indexPath.row];
    ProtossInfo * info = [[ProtossInfo alloc] initWithNibName:@"ProtossInfo" bundle:nil];

     // ...
     // Pass the selected object to the new view controller.
    [self.navigationController pushViewController:info animated:YES];

    info.title = data.titler;
    info.minerals.text = data.min;
    info.vespene.text = data.vesp;
    info.supply.text = data.sup;
    info.portrait.image = data.porty;

    [info release];
    [data release];

}  

4 个答案:

答案 0 :(得分:6)

您正在发布data,但您没有retain

答案 1 :(得分:3)

你不应该这样做:

[data release]

...因为'数据'不是通过alloc,new,retain等获得的。 很可能它第二次崩溃的原因是堆被双重免费破坏了。

答案 2 :(得分:1)

在代码中,您写的是

RaceData * data = [self.units objectAtIndex:indexPath.row];

这意味着您将该特定对象的引用带入“data”对象。

但是你试图释放那个对象。

因此nil值将替换为“units”数组中的那个索引。

因此,当您第二次单击时,您将从nil对象访问属性(如titler,min等...)。但它没有那些。所以它崩溃了。

删除[数据发布];声明,然后它将被解决。

此致

萨蒂亚

答案 3 :(得分:0)

您不应该发布来自[self.units objectAtIndex:indexPath.row]的数据; 而且,我认为你应该阅读the apple's memory management guide.