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(应该一直都是这样)并且它仍然在发生.所以我们没有得到整数溢出或任何东西.
我刚刚在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改变为做它的时候首先做广告,这是不幸的,很可能会把人赶出去.
正如您所看到的,这是一个简单的整数溢出,所以如果您知道您在其中工作的范围可以轻松解决这个问题.
归档时间: |
|
查看次数: |
808 次 |
最近记录: |