【问题标题】:EXC-BAD-ACCESS when setting a relationship between two objects设置两个对象之间的关系时出现 EXC-BAD-ACCESS
【发布时间】:2013-04-29 06:49:29
【问题描述】:

谁能解释一下为什么给出以下 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 bad access。

更新 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 的对象。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢 casademora,似乎即使保存了导入对象的上下文,但实际上这些对象仍然具有临时 ID。这是因为魔法记录使用父上下文将数据实际保存到存储中。因为我已经从对象中取出了对象 id,所以在保存父上下文时它不会更新。
    • 我在发现解决我的问题的方法后更新了问题,您能否解释一下为什么会这样?
    • existingObjectWithID 有效,因为它只返回当前上下文中的对象。我最近自己遇到了这个问题并更新了 MR_inContext: 以通过所有方法来查找基于 objectID 的对象。看看这个实验分支。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多