【发布时间】:2011-11-16 16:35:58
【问题描述】:
我会被这个 bug 发疯的! 我有这段代码在 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
请帮忙! 谢谢你的提前。
##EDIT :## 我对这个问题进行了更多调查。似乎问题来自在 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年多的编码从来没有见过这样的东西,这个bug真的让我觉得我不知道如何编码......
【问题讨论】:
-
您可以尝试使用
[NSNumber numberWithLong: ...进一步调查问题。 -
您可能应该打印
[curRegistered objectForKey:@"ticket_id"]的“原始”值以查看是否存在任何奇怪的字符。 -
(我注意到您上面的第一个代码 sn-p 缺少一个 '[',但我认为这是一个复制/粘贴错误。)
-
尝试将数值
[[curRegistered...分配给临时int,然后使用该int设置您的newRegistered值,而不是在一个语句中进行。并在代码中对 tempint进行一些其他用途,以防止其被优化。这闻起来是与优化相关的错误。 -
您在两个 sn-ps 中都缺少大括号,请正确匹配它们,顶部的可能不明确。如果我正确解释了括号应该在哪里,你为什么要从
NSNumber到int再回到NSNumber?