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年以上的编码,这个错误真的让我觉得我不知道如何代码...

+0

您可以尝试使用'[NSNumber numberWithLong:...'来进一步调查问题。 – dasdom

+0

它是模拟器/设备吗? – debleek63

+0

您应该打印'[curRegistered objectForKey:@“ticket_id”]'的“raw”值以查看是否存在任何古怪的字符。 –

一个暗示:789654截断为16位是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位。

+0

非常感谢,就是这样...我只是想知道为什么它在iOS 4.3上工作...让我们认为Int 16/32/64没有任何效果... – THClem

+0

iOS 5可能更严格关于强制内存中的属性类型,而4.3是让它滑落。我敢打赌,即使在数据被实际保存到Sqlite数据库时,它也会被截断。 –