iOS 5 NSNumber Bug
我会因为这个bug而变得疯狂! 我有这样的一段代码,如果我做的iOS 4.3iOS 5 NSNumber Bug
newRegistered.ticket_id = [NSNumber numberWithInt:
[curRegistered objectForKey:@"ticket_id"] intValue]];
效果很好:
NSLog(@"ID before : %d, ID after : %d",
[curRegistered objectForKey:@"ticket_id"] intValue], [newRegistered.ticket_id intValue]);
我在iOS 4.3有:
ID前:经过35459 ID :35459
而在iOS 5.0上:
ID前:35459,编号:-30077
请帮帮忙! 谢谢你的提前。
##编辑︰## 我已经调查了更多的问题。看来问题来自在CoreData中分配NSNumber。我应该指定上面的代码片段与CoreData一起使用(newRegistered是一个NSManagedObject,curRegistered是一个包含JSON数据的NSDictionary(只有字符串,从不是int或long ...))。
下面是具体的问题:
long long test = 789654;
Registereds *a = [NSEntityDescription insertNewObjectForEntityForName:@"Registereds" inManagedObjectContext:self.managedObjectContext];
a.ticket_id = [NSNumber numberWithLongLong:test];
NSLog(@"%lld -> %@", test, a.ticket_id); // Displays 789654 -> 3222 on iOS 5 and 789654 -> 789654 on iOS 4.3
NSNumber *ticket_id = [NSNumber numberWithLongLong:test];
NSLog(@"%lld -> %@", test, ticket_id); // Displays 789654 -> 789654
如此看来问题来自于Registereds对象(这是一个NSManagedObject,像newRegistered在前面的例子)。
你知道为什么会发生这种情况吗?我从来没有见过这样的事情在2年以上的编码,这个错误真的让我觉得我不知道如何代码...
一个暗示:789654截断为16位是3222
我试图复制你的问题与iOS 5.我可以得到NSLog(@"%lld -> %@", test, a.ticket_id)
显示'789654 - > 3222'的唯一方法是如果我将ticket_id属性类型设置为Integer 16
。如果我将其设置为Integer 32
或Integer 64
,则会显示预期值。
在数据模型编辑器中检查ticket_id
的属性类型。因为您使用的是long long
,我认为它应该设置为Integer 64
。从你展示的内容我会怀疑它设置为Integer 16
。如果不是,则该值在其他地方被截断为16位。
非常感谢,就是这样...我只是想知道为什么它在iOS 4.3上工作...让我们认为Int 16/32/64没有任何效果... – THClem
iOS 5可能更严格关于强制内存中的属性类型,而4.3是让它滑落。我敢打赌,即使在数据被实际保存到Sqlite数据库时,它也会被截断。 –
您可以尝试使用'[NSNumber numberWithLong:...'来进一步调查问题。 – dasdom
它是模拟器/设备吗? – debleek63
您应该打印'[curRegistered objectForKey:@“ticket_id”]'的“raw”值以查看是否存在任何古怪的字符。 –