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_ACCESS
occurs 上面的行没有任何问题。但是,它可以提供team
或sport
objects存在问题的线索。寻求的第一个途径是其中一个对象已被释放,因为它没有被充分保留。
释放的对象可能不会立即释放。这就是为什么EXC_BAD_ACCESS
会在奇怪的时间出现的原因。仅当不再需要它们正在使用的内存块时,才会释放对象。其他对象当然会使用相同的块。因此,当该块符合释放条件时,您作为开发人员无法控制。这是由运行时处理的。
最好的办法是先运行 Analyzer,然后运行 Instruments,使用 Leaks 仪器进行分析。
对这一切都有很好的解释,并在 Lou Franco 的网站上提供了关于追踪EXC_BAD_ACCESS
errors 的逐点建议:
Understanding EXC_BAD_ACCESS
【讨论】:
以上是关于EXC_BAD_ACCESS NSArray of ManagedObjects(核心数据)的主要内容,如果未能解决你的问题,请参考以下文章
在 AVAssetReader 中获取 Exc_Bad_access
核心数据 - 访问从 fetch EXC_BAD_ACCESS 返回的对象
关于React Native报Cannot initialize a parameter of type ‘NSArray<id<RCTBridgeModule>>错误的解决方案