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

Posted

技术标签:

【中文标题】设置两个对象之间的关系时出现 EXC-BAD-ACCESS【英文标题】:EXC-BAD-ACCESS when setting a relationship between two objects 【发布时间】: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 的对象。

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

以上是关于设置两个对象之间的关系时出现 EXC-BAD-ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

同步关系数据库时出现 Microsoft Sync 框架问题

尝试在 Django 中的模型表之间建立关系。但是在插入值时出现错误 |外键项必须是一个实例

Postgresql:更改所有者对象时出现错误“必须是关系的所有者”

当我设置两个有效对象之间的关系时,validateForInsert 失败

计算两个日期之间的差异时出现 AWS Redshift 错误

运行 make 迁移时出现 Django 关系错误