2010-09-26 107 views
0

迁移后,我的一个数值应该为非零,现在显示为零。如果我不迁移,该值将保留其非零值。核心数据迁移失去NSNumber值

我第一次尝试在这样的管理对象设置数值:

[temp setNumUses:temp.numUses+1]; 

...但造成an'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'。

想法?

回答

0

最简单的解释是,迁移某种程度上说服Core Data 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]; 

一般来说,初始化方法参数中的任何对象是不好的做法。您正在寻求令人讨厌的内存泄漏,这将很难追查到。泄漏报告可能不会显示在调用方法的代码中,而是在方法本身中显示。

+0

嗨,我想指出,我在Objective-C编程方面相对较新。我在分配之前尝试了NSNumber类的方法,但我想覆盖所有的基础,以确保一切。无论如何还是有NSNumber值为0的问题。有没有关于核心数据迁移模型的任何提示?要在我的代码中迁移数据库,我只需按照指南添加自动迁移,是否有更好的方法/使用该方法修复此问题的简单方法呢? – 2010-09-27 16:36:55

+0

另外,为什么会:[temp setNumUses:temp.numUses + 1];结束工作?我前一段时间编写了该代码,此后已被替换,但在迁移之前它确实有效。是否有操作符方法写入NSNumber?或者这些不存在?谢谢! – 2010-09-27 16:38:26

+0

NSNumber没有操作符方法。你不能只为NSNumber对象添加标量。如果你尝试,你会实际增加对象的地址。我不知道你的移民失败的原因。 – TechZen 2010-09-27 22:13:22