EXC_BAD_ACCESS管理对象的NSArray(核心数据)

时间:2010-06-20 23:24:36

标签: iphone nsarray exc-bad-access nsfetchedresultscontroller nsmanagedobject

我的iphone应用程序发生了一些奇怪的事情。我正在使用Core Data将数据存储在SQLite数据库中。我的应用程序启动后第一次尝试读取一个表来返回所有行以填充UITableView,其中列出了供用户选择的内容。如果他们选择列表中的顶级项,我会得到一个EXC_BAD_ACCESS异常。如果他们选择任何其他项目一切似乎没问题。以下是代码示例:Sport和Team是NSManagedObjects。 sports是使用NSFetchedResultsController(fetchedObjects)获取的运动对象的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错误。在我再次重新启动应用程序后,问题消失了,代码按预期工作:(

1 个答案:

答案 0 :(得分:0)

上面发生EXC_BAD_ACCESS的行没有错。但是,它可以提供一个问题,即teamsport对象存在问题。追求的第一个途径是其中一个对象已被解除分配,因为它没有得到足够的保留。

发布的对象可能无法立即解除分配。这就是为什么EXC_BAD_ACCESS可能在奇怪的时候发生的原因。只有在不再需要它们使用的内存块时才会释放对象。其他对象当然会使用相同的块。因此,当该块有资格进行重新分配时,作为开发人员无法控制。这是由运行时处理的。

最好的办法是首先运行分析仪,然后运行仪器,使用泄漏仪器进行分析。

对于所有这些以及关于追踪Lou Franco网站上EXC_BAD_ACCESS错误的逐点建议有一个很好的解释:

Understanding EXC_BAD_ACCESS