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

时间:2011-12-03 00:20:15

标签: ios core-data ios5 nsnumber

我有一个带有NSNumber属性的CoreData实体(模型中的Integer 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]);
运行测试时,

changeAmount是一个值为123000的int。当我在iOS 4上测试时,一切正常并打印出123000.但是,如果我在iOS 5上运行相同的代码,则值类似于-8072或-25,536。像这样:

raw changeAmount=123000
number changeAmount=123000 = 123000
new changeAmount=-8072

导致这种情况的iOS4和iOS5之间发生了什么?我一直在错误地设置我的NSNumber属性吗?

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

1 个答案:

答案 0 :(得分:5)

我刚在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对于强制执行其类型变得更加严格。我被它抓住了但是我应该对我正在做的事情更加警惕,如果Apple改变了他们的API,那么它不会像人们会抱怨的那样表现但是当API改变为做它的时候首先做广告,这很不幸,很可能会把人赶出去。

正如你所看到的,这是一个简单的整数溢出,所以如果你知道你工作的范围,你可以很容易地解决这个问题。