【问题标题】:Why does it crash the second time?为什么第二次会崩溃?
【发布时间】:2010-12-02 05:36:35
【问题描述】:

大家好, 我是 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];

}  

【问题讨论】:

    标签: iphone objective-c uitableview crash


    【解决方案1】:

    你发布了data,而你没有发布retain

    【讨论】:

    • 为了将来参考,你应该在你的可执行设置中将turn onNSZombieEnabled作为一个参数,这对调试EXC_BAD_ACCESS非常有帮助。
    【解决方案2】:

    你不应该这样做:

    [data release]
    

    ...因为“数据”不是通过分配、新建、保留等方式获得的。 它第二次崩溃的最有可能的原因是堆被双释放损坏了。

    【讨论】:

      【解决方案3】:

      这里的代码,你写的像

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

      这意味着您正在将该特定对象的引用纳入“数据”对象。

      但您正试图释放该对象。

      因此,nil 值将在该“单位”数组中的该索引处被替换。

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

      删除[数据发布];声明,然后就解决了。

      问候,

      萨提亚

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-07-09
          • 1970-01-01
          • 2015-04-12
          • 2013-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-20
          相关资源
          最近更新 更多