我有一个带有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(应该一直都是这样)并且它仍在发生。所以我们没有得到整数溢出或任何东西。
答案 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改变为做它的时候首先做广告,这很不幸,很可能会把人赶出去。
正如你所看到的,这是一个简单的整数溢出,所以如果你知道你工作的范围,你可以很容易地解决这个问题。