iOS5 CoreData实体显示错误的NSNumber值,适用于iOS4

iOS5 CoreData实体显示错误的NSNumber值,适用于iOS4,ios,core-data,ios5,nsnumber,Ios,Core Data,Ios5,Nsnumber,我有一个具有NSNumber属性的CoreData实体(模型中的整数16)。我有以下代码: NSLog(@"raw changeAmount=%d", changeAmount); NSNumber *changeNumber = [NSNumber numberWithInt:changeAmount]; NSLog(@"number changeAmount=%d = %@", [changeNumber intValue], changeNumber); record.changeA

我有一个具有NSNumber属性的CoreData实体(模型中的整数16)。我有以下代码:

NSLog(@"raw changeAmount=%d", changeAmount);

NSNumber *changeNumber = [NSNumber numberWithInt:changeAmount];

NSLog(@"number changeAmount=%d = %@", [changeNumber intValue], changeNumber);

record.changeAmount = changeNumber;

NSLog(@"new changeAmount=%d", [record.changeAmount intValue]);
changeamunt
是一个int,在我运行测试时,它的值为123000。当我在iOS 4上测试时,一切正常,并打印出123000。但是,如果我在iOS5上运行相同的代码,则值类似于-8072或-25536。像这样:

raw changeAmount=123000
number changeAmount=123000 = 123000
new changeAmount=-8072
iOS4和iOS5之间到底发生了什么导致了这种情况?我是否一直在错误地设置NSNumber属性


这似乎不是一个整数大小的问题,因为我将模型更改为使用整数32(它应该一直都是这样),并且它仍然在发生。所以我们没有得到整数溢出或任何东西。

我刚刚在CodeRunner中运行了这段代码

size_t shortSize = sizeof(short);
size_t intSize   = sizeof(int);

short short123000 = 123000;
int   int123000   = 123000;

NSString *format = @"\nshortSize       => %d\n"
                   @"int Size          => %d\n"
                   @"short with 123000 => %d\n"
                   @"int with 123000   => %d";

NSLog(format, shortSize, intSize, short123000, int123000);
其结果是:

shortSize         => 2  
int Size          => 4  
short with 123000 => -8072  
int with 123000   => 123000
NB大小以字节为单位,一个字节中有8位,因此2*8=16位和4*8=32位

我的一些应用程序也有类似的问题。CoreData似乎在强制执行其类型方面变得更加严格了。我被它给逮住了,但我应该对我正在做的事情更加警惕,如果苹果改变了他们的API,使它的行为不符合人们会抱怨的预期,但当API改变为做它最初宣传的事情时,这只是不幸的,而且可能会让人们感到惊讶


正如您所看到的,这是一个简单的整数溢出,因此,如果您知道您的工作范围,您可以轻松解决此问题。

嗨,Paul,感谢您的回复!我在你打字的时候编辑了我的帖子,因为我也这么想。我将我的模型更新为int32s,但它仍在发生。我将假设更新模型有问题,因为-8072不可能是巧合。谢谢。我猜,虽然您更新了模型,但值已经作为-8072保存在数据库中。因此,当您进行迁移时,迁移如何知道-8072不是您想要的?它不能仅仅假设值已溢出。啊,找到了!我显然是更新了错误的模型。在更改之前,我创建了一个新版本,将新版本设置为当前版本,我以为我正在编辑新版本,但是,唉,没有。我将旧模型更改为int16,将新模型更改为int32,现在它可以正常工作了。