1

我的 iPhone 应用程序发生了一些奇怪的事情。我正在使用 Core Data 将数据存储在 SQLite 数据库中。我的应用程序启动后第一次尝试读取一个表以返回所有行以填充 UITableView,其中包含供用户选择的内容列表。如果他们选择了列表中的顶部项目,我会得到一个 EXC_BAD_ACCESS 异常。如果他们选择任何其他项目,一切似乎都很好。这是代码示例: Sport 和 Team 是 NSManagedObjects。sports 是使用 NSFetchedResultsController (fetchedObjects) 获取的 Sport 对象的 NSArray。我可以在 UITableView 中很好地显示对象列表(我对 cellForRowAtIndexPath() 调用使用相同的数组,没有任何问题

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    Sport *sport = (Sport *)[sports objectAtIndex:indexPath.row];

    if (teamSetup) {
        if (team.sport != sport) {
            [team setSport:sport]; <-- this is where the EXC_BAD_ACCESS happens

            NSError *error;
            [team.managedObjectContext save:&error];
        }
        [self.navigationController popViewControllerAnimated:YES];

    } else {
        // .. do some other stuff

    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

更新:它似乎只影响 NSArray 中的最后一条记录而不是第一条记录,直到它抛出 EXC_BAD_ACCESS 错误。在我再次重新启动应用程序后,问题消失了,代码按预期工作:(

4

1 回答 1

0

上面EXC_BAD_ACCESS发生的行没有任何问题。但是,它可以提供一个线索,表明teamsport对象存在问题。追求的第一个途径是其中一个对象已被释放,因为它没有被充分保留。

释放的对象可能不会立即释放。这就是为什么它EXC_BAD_ACCESS会在奇怪的时候发生。仅当不再需要它们正在使用的内存块时,才会释放对象。其他对象当然会使用相同的块。因此,当该块符合释放条件时,您作为开发人员无法控制。这是由运行时处理的。

最好的办法是先运行 Analyzer,然后运行 ​​Instruments,使用 Leaks 仪器进行分析。

EXC_BAD_ACCESS对这一切都有很好的解释,以及在 Lou Franco 的网站上跟踪错误的逐点建议:

了解 EXC_BAD_ACCESS

于 2011-11-09T11:40:16.857 回答