iOS5 CoreData实体显示错误的NSNumber值,适用于iOS4
我有一个具有NSNumber属性的CoreData实体(模型中的整数16)。我有以下代码: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
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,现在它可以正常工作了。