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

Ken*_*and 4 core-data nsnumber ios ios5

我有一个具有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]);
Run Code Online (Sandbox Code Playgroud)

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

raw changeAmount=123000
number changeAmount=123000 = 123000
new changeAmount=-8072
Run Code Online (Sandbox Code Playgroud)

iOS4和iOS5之间究竟发生了什么?我一直在错误地设置我的NSNumber属性吗?

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

Pau*_*l.s 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);
Run Code Online (Sandbox Code Playgroud)

这导致:

shortSize         => 2  
int Size          => 4  
short with 123000 => -8072  
int with 123000   => 123000
Run Code Online (Sandbox Code Playgroud)

NB大小以字节为单位,一个字节有8位,因此2*8 = 16位,4*8 = 32位.

我与我工作的一些应用程序有类似的问题.似乎CoreData对于强制执行其类型变得更加严格.我被它抓住了但是我应该对我正在做的事情更加警惕,如果Apple改变了他们的API,那么它不会像人们会抱怨的那样表现但是当API改变为做它的时候首先做广告,这是不幸的,很可能会把人赶出去.

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