核心数据迁移失去NSNumber值

时间:2010-09-26 03:40:40

标签: objective-c core-data migration exc-bad-access nsnumber

迁移后,我的一个非零值数值现在显示为零。如果我不迁移,则该值保留其非零值。

我首先尝试在托管对象中设置一个数字值,如下所示:

[temp setNumUses:temp.numUses+1];

...但是这导致'EXC_BAD_ACCESS'所以我将其更改为:

int hold = ((int)[[temp valueForKey:@"numUses"] intValue]);
hold++;
[temp setNumUses:[[NSNumber alloc] initWithInt:hold]];

...但是在迁移之后,此代码声称hold在运行新代码之前初始化为值为0的int,其值明显为1或更多(指的是测试对象,只用过一次)。

当我不迁移核心数据数据库时,NSNumber通过许多上下文保存和应用程序终止保持其价值。

我可能会缺少什么?我有一些广泛的代码可以修改存储在别处的数据库中已更改的NSManagedObjects的值,但是没有一个代码篡改'numUses'。

思想?

1 个答案:

答案 0 :(得分:0)

最简单的解释是迁移以某种方式说服核心数据numUses是一个默认值为零的新属性。原因在于迁移模型,而不是您提供的分配代码。

但是,父级中的代码确实建议您不太了解NSNumber并且错过在其他地方使用NSNumber可能会导致您的问题。

NSNumber只是数值的对象包装器。您无法使用它执行操作。这就是为什么这一行:

[temp setNumUses:temp.numUses+1];

...导致EXC_BAD_ACCESS。正如您所发现的,您必须将NSNumber转换为int或NSDecimalNumber以对其执行数学运算。

这一行:

[temp setNumUses:[[NSNumber alloc] initWithInt:hold]];

......会泄漏内存。您初始化NSNumber对象但从不释放它。在这种情况下(以及绝大多数情况),您应该使用类方法来创建NSNumbers,因为它们返回一个不会泄漏的自动释放对象。所以:

[temp setNumUses:[NSNumber numberWithInt:hold];

通常,初始化方法参数中的任何对象都是不好的做法。您要求的是令人讨厌的内存泄漏,这将很难追查。泄漏的报告可能不会出现在调用方法的代码中,而是出现在方法本身中。