在 CoreData 和 EXC_BAD_ACCESS 信号中插入实体

Posted

技术标签:

【中文标题】在 CoreData 和 EXC_BAD_ACCESS 信号中插入实体【英文标题】:Inserting entity in CoreData and EXC_BAD_ACCESS signal 【发布时间】:2011-08-09 14:26:14 【问题描述】:

我正在编写一个与服务器同步的程序。同步在前台运行,但使用 LRResty 和委托来获取响应。随机地,当我运行同步时,我得到 EXC_BAD_ACCESS 信号运行此代码或添加 CoreData 中的一些其他插入/关系:

WorkoutExerciseSet *set = [NSEntityDescription insertNewObjectForEntityForName:@"WorkoutExerciseSet" inManagedObjectContext:mObjContext];

因此,我认为给出了错误,因为此代码实际上并未在主线程上运行。这可能是原因吗?哪个是最好的解决方法?

【问题讨论】:

EXC_BAD_ACCESS 通常来自向释放的对象发送消息。您没有发布足够的代码来确定问题的根源。 WorkoutExerciseSet 是实体还是关系? NSEntityDescription 将返回一个 NSEntity 实例,因此您需要引用您的实体名称而不是关系。获取对实体的引用,然后通过访问相关关系来获取集合。即NSEntity *person = [....,然后使用NSSet *workouts = [person valueForKey:@"workoutExerciseSet"]进行锻炼 【参考方案1】:

给定代码行中 EXC_BAD_ACCESS 的唯一可能来源是 mObjContext 的值为 nil。您正在沿线某处丢失 NSManagedObjectContext 对象。

根据那一行代码,您可能没有正确使用评估器。托管对象上下文几乎总是包含插入代码的对象的属性,因此该行应该如下所示:

WorkoutExerciseSet *set = [NSEntityDescription insertNewObjectForEntityForName:@"WorkoutExerciseSet" inManagedObjectContext:self.mObjContext];

... 以确保正确访问上下文对象。同样,当您设置属性值时,它应该是:

self.mObjContext=someManagedObjectContext;

【讨论】:

这些都是好点,谢谢,似乎问题是从不同的线程访问相同的 ManagedObjectContext,所以这可能是 EXC_BAD_ACCESS 的原因。我解决了它在 ManagedObjectContext 上加了一个锁,这样即使从不同的线程访问它也可以按顺序访问。 在多个线程上使用上下文是一种不好的做法。如果你有多个线程,你应该为每个线程创建一个单独的上下文。

以上是关于在 CoreData 和 EXC_BAD_ACCESS 信号中插入实体的主要内容,如果未能解决你的问题,请参考以下文章

在 CoreData 中更新和编辑实体

在 CoreData 中存储和获取字典数组

CoreData 在插入和删除时崩溃同时发生

Coredata 和 Mogenerator,coredata 标志并发问题 EXC_BAD_INSTRUCTION

CoreData、NSFetchedResultsController 和 performFetch:

CoreData:持久和临时存储