2011-08-09 23 views
0

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

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

所以我在想该错误给出因为这段代码是不实际运行在主线程上。这可能是原因吗?哪种解决方案最好?

+1

'EXC_BAD_ACCESS'通常来自将消息发送到解除分配的对象。您尚未发布足够的代码来确定问题的创建位置。 – highlycaffeinated

+0

是'WorkoutExerciseSet'一个实体还是一个关系? NSEntityDescription将返回一个NSEntity实例,因此您需要引用实体名称而不是关系。获取对实体的引用,然后通过访问相关关系获取集合。即'NSEntity * person = [....'然后用'NSSet * workouts = [person valueForKey:@“workoutExerciseSet”]获取锻炼' – Rog

回答

0

给出的代码行中唯一可能的EXC_BAD_ACCESS来源是mObjContext有一个零值。你沿着线丢失你的NSManagedObjectContext对象。

基于这一行代码,您可能没有正确使用评估者。在管理对象方面几乎总是保持插入代码的对象的属性,这样行也许应该是这样的:

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

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

self.mObjContext=someManagedObjectContext; 
+0

这些都是好的,谢谢,好像问题是访问相同的ManagedObjectContext来自不同的线程,所以可能这是** EXC_BAD_ACCESS **的原因。 我解决了它在ManagedObjectContext上放置一个锁,这样即使从不同的线程访问它,它也是按顺序访问的。 – Fr4ncis

+0

在多个线程上使用上下文是不好的做法。如果你有多个线程,你应该为每个线程创建一个单独的上下文。 – TechZen