EXC_BAD_ACCESS NSArray of ManagedObjects(核心数据)

Posted

技术标签:

【中文标题】EXC_BAD_ACCESS NSArray of ManagedObjects(核心数据)【英文标题】:EXC_BAD_ACCESS NSArray of ManagedObjects (Core Data) 【发布时间】:2010-06-20 23:24:35 【问题描述】:

我的 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】:

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

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

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

对这一切都有很好的解释,并在 Lou Franco 的网站上提供了关于追踪EXC_BAD_ACCESSerrors 的逐点建议:

Understanding EXC_BAD_ACCESS

【讨论】:

以上是关于EXC_BAD_ACCESS NSArray of ManagedObjects(核心数据)的主要内容,如果未能解决你的问题,请参考以下文章

在 AVAssetReader 中获取 Exc_Bad_access

核心数据 - 访问从 fetch EXC_BAD_ACCESS 返回的对象

NSArray of doubles iOS(目标 c)

关于React Native报Cannot initialize a parameter of type ‘NSArray<id<RCTBridgeModule>>错误的解决方案

OpenGL ES glReadPixels exc_bad_access

了解 objc 中块内存管理的一种极端情况