在 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 和 Mogenerator,coredata 标志并发问题 EXC_BAD_INSTRUCTION