设置两个对象之间的关系时EXC-BAD-ACCESS

时间:2013-04-29 06:49:30

标签: objective-c exc-bad-access nsmanagedobjectcontext magicalrecord nsmanagedobjectid

任何人都可以解释为什么给出以下MagicalRecord导入代码

__block NSManagedObject *importedObject = nil;

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
  id entityClass = NSClassFromString( name );
  importedObject = [entityClass importFromObject:dictionary inContext:localContext];
}];

NSManagedObjectID *importedObjectID = importedObject.objectID;

NSManagedObject *relatedObject = ( (CustomRelatedExampleObject *) [[NSManagedObjectContext defaultContext] objectWithID:importedObjectID] ).relatedObject;

这样可以正常工作,设置关系并按预期保存

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
        someObjectInDefaultContext.alsoRelated = relatedObject;
}];

但是这会导致exec访问不良,当我预计这在技术上更正确时,因为我使用本地上下文来保存我的数据。 (注意:为了简洁,我遗漏了从两个对象获取objectID的代码)

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
        AnotherCustomExampleObject *localSomeOtherObjectInDefaultContext = (AnotherCustomExampleObject *) [localContext objectWithID:someOtherObjectInDefaultContextObjectID];
        CustomRelatedExampleObject *localRelatedObject = (CustomRelatedExampleObject *) [localContext objectWithID:localRelatedObjectID];
        localSomeOtherObjectInDefaultContext.alsoRelated = localRelatedObject;
}];

当我尝试将对象分配给另一个对象中的关系时,我在最后一行得到exec错误访问。

更新1

此问题是由在另一个托管对象上下文中获取对象的本地副本时使用临时对象ID引起的。

更新2

我发现只需更改用于检索对象的方法就可以删除错误。

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
    AnotherCustomExampleObject *localSomeOtherObjectInDefaultContext = (AnotherCustomExampleObject *) [localContext existingObjectWithID:someOtherObjectInDefaultContextObjectID];
    CustomRelatedExampleObject *localRelatedObject = (CustomRelatedExampleObject *) [localContext existingObjectWithID:localRelatedObjectID];
    localSomeOtherObjectInDefaultContext.alsoRelated = localRelatedObject;
}];

使用existingObjectWithID而不是objectWithID返回带有永久id而不是临时id的对象。

1 个答案:

答案 0 :(得分:1)

检查您的对象ID。如果其中一个或两个都是临时的,核心数据将不会那样。但是,一般来说,您描述的崩溃是因为您试图将来自不同上下文的两个对象关联起来。我知道你在这里经历了正确的步骤,但也许在调试器中仔细检查以确保这些对象的上下文是相同的。