0

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

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

[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 或更大(指的是仅使用了 1 次的测试对象)。

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

我可能会错过什么?我有一些广泛的代码可以修改存储在其他地方的数据库中更改的 NSManagedObjects 的值,但没有一个会篡改“numUses”。

想法?

4

1 回答 1

0

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

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

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

[temp setNumUses:temp.numUses+1];

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

这一行:

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

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

[temp setNumUses:[NSNumber numberWithInt:hold];

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

于 2010-09-26T14:06:13.313 回答