iOS 5 NSNumber Bug

时间:2011-11-16 16:35:58

标签: iphone ios nsnumber

我会因为这个错误而疯狂! 我有这段代码在iOS 4.3上运行良好

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,ID之后:-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年多的编码中从未见过类似的东西,这个错误让我觉得我不知道如何编码......

1 个答案:

答案 0 :(得分:5)

提示:截断为16位的789654为3222。

我试图用iOS 5复制你的问题。我可以NSLog(@"%lld -> %@", test, a.ticket_id)显示'789654 - >的唯一方法3222'是我将ticket_id属性类型设置为Integer 16。如果我将其设置为Integer 32Integer 64,则会显示预期值。

在数据模型编辑器中检查ticket_id的属性类型。因为您使用long long我认为它应该设置为Integer 64。从你所展示的内容我怀疑它被设置为Integer 16。如果没有,则该值在其他地方被截断为16位。