【问题标题】:iOS 5 NSNumber BugiOS 5 NSNumber 错误
【发布时间】: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 值,而不是在一个语句中进行。并在代码中对 temp int 进行一些其他用途,以防止其被优化。这闻起来是与优化相关的错误。
  • 您在两个 sn-ps 中都缺少大括号,请正确匹配它们,顶部的可能不明确。如果我正确解释了括号应该在哪里,你为什么要从NSNumberint 再回到NSNumber

标签: iphone ios nsnumber


【解决方案1】:

提示: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 位。

【讨论】:

  • 非常感谢,就是这样...我仍然想知道为什么它可以在 iOS 4.3 上运行...让我们认为 Int 16/32/64 没有任何影响...
  • iOS 5 可能更严格地强制执行内存中的属性类型,而 4.3 则放任不管。我敢打赌,即使在 4.3 中,当数据实际保存到 Sqlite 数据库时,它也会被截断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2011-12-18
相关资源
最近更新 更多