核心数据关系不良访问 - 通过更改关系名称来修复?

时间:2014-07-31 07:09:49

标签: ios xcode core-data

我昨天下午花了一个非常奇怪的问题。我有一个核心数据模型。简单来说,有一个呼叫实体和一个新的WOs实体,它在呼叫和新的WO之间具有可选的一对多关系。

呼叫 - >> newWO

调用对象上的newWosForCall和newWO对象上的callForNewWO。

我开始收到错误的访问错误。为了帮助调试,我创建了一个带有单个按钮和简化代码的新视图控制器。我使模拟器空白,因此核心数据中没有任何内容。我添加了一个调用对象来调用数据。核心数据中没有newWO对象。

在按钮上单击我访问了关系的数据,即

Call *aCall=.... get a call object from a fetch request
if (aCall.newWOsForCall.count==0)
{NSLog(@"no new wos");}
else
{NSLog(@"there are WOs");

并且在第一次点击时一切都很好。再次单击该按钮,我得到一个错误的访问错误。这种行为是一致的 - 第一次访问是正常的,然后以任何方式第二次访问调用.newWOsForCall关系导致错误。

下午的简短版本是:我尝试删除双方的关系并重新创建它。我清理了项目然后重新编译并具有相同的行为。在大肆宣誓并检查调用对象之外的其他关系在绝望中工作正常后,我只需将重新编辑从newWOsForCall重命名为pleaseDamnWellWork(实名更咒骂)。我重新编译,更改按钮上的代码以获得新的关系名称....它适用于每次点击。完全没有错误的访问错误。

只是为了证明这是问题,我将关系重新命名为newWOsForCall并开始获得与以前相同的行为 - 第一次点击很好,第二次点击错误。

我知道我有工作代码 - 我非常感激,但有没有人遇到类似的东西?知道为什么它不喜欢这个关系的特定名称吗?

我对其他关系使用了类似的命名约定,它们很好 - 例如call->> LogFile关系称为logFilesForCall

1 个答案:

答案 0 :(得分:1)

某些方法名称在ARC中具有特殊含义和处理。这部分是出于历史原因,并且需要使一切工作。例如:

  

alloc,copy,init,mutableCopy和new系列中的方法隐式标记为 attribute ((ns_returns_retained))。这可以通过明确标记方法属性((ns_returns_not_retained))来抑制。

所以,通过在方法的开头使用单词new(返回关系),你告诉ARC一些不正确的东西。

此外,在持久数据存储的上下文中,'newWO'中的'new'是什么意思?以后从商店中取出物品时会有意义吗?

因此,您需要更改名称,通常也应该更改实体的名称。