【问题标题】:Inserting entity in CoreData and EXC_BAD_ACCESS signal在 CoreData 和 EXC_BAD_ACCESS 信号中插入实体
【发布时间】: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"]进行锻炼

标签: ios multithreading core-data


【解决方案1】:

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

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

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

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

self.mObjContext=someManagedObjectContext;

【讨论】:

  • 这些都是好点,谢谢,似乎问题是从不同的线程访问相同的 ManagedObjectContext,所以这可能是 EXC_BAD_ACCESS 的原因。我解决了它在 ManagedObjectContext 上加了一个锁,这样即使从不同的线程访问它也可以按顺序访问。
  • 在多个线程上使用上下文是一种不好的做法。如果你有多个线程,你应该为每个线程创建一个单独的上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多