【问题标题】:How are integers stored in iOS, in particular in .pList and CoreData [duplicate]整数如何存储在 iOS 中,特别是在 .pList 和 CoreData [重复]
【发布时间】:2013-08-11 11:01:12
【问题描述】:

我正在尝试从 pList 中获取一个小整数(例如 4)并将其放入托管对象中以供以后操作。但是,当我将它从托管对象中取出并放入 NSInteger 时,它已经完全改变了。 4变成了237371328!

数字在 pList 中存储为“Number”,在管理对象中存储为整数 16。 我有两个字段:timesAsNumber 是整数 16,timesUsed 是字符串(我目前的工作!)。

涉及的代码行是:

NSArray *usageFetchResults = [self.objectContext executeFetchRequest:request error:&error];

NSLog(@"Here is the usageArray: %@, with error: %@",usageFetchResults, error);

这给出了日志结果:

数据:{\n feature = video;\n timesAsNumber = 4;\n timesUsed = 4;\n})" ),错误:(null)

所以记录器知道 timesAsNumber 的值为 4。

NSLog(@"timesAsNumber straight from the Managed Object: %@", [currentUseData valueForKey:@"timesAsNumber"]);

直接从托管对象产生结果:timesAsNumber:4 所以仍然没有问题。

然而,

NSInteger timesUsedAsInt = [currentUseData valueForKey:@"timesAsNumber"];
NSLog(@"times As Number now reads: %ld", (long)timesUsedAsInt);

产生结果:times As Number 现在读取:237371328

我需要将数字作为整数进行操作,而我将存储为字符串并来回转换的解决方法并不优雅!

我教高中计算,所以我知道浮点数的存储:excess-127、二进制补码等。我认为问题是由整数在 pList、托管对象和 NSInteger 中存储的不同方式引起的。但是,我无法弄清楚这些存储方法是什么,以便我可以使用它们。

感谢您的帮助。

提姆。

【问题讨论】:

  • 编译器没有警告“不兼容的整数转换指针”吗?
  • 仅当我尝试将值分配给 int 或 unsigned int 时。 NSInteger 很高兴。我认为李维斯的回答会奏效。我现在不在我的机器旁,所以我稍后会回来。

标签: ios numbers integer storage


【解决方案1】:

当您在plistcoreData 中存储一个数字时,它被存储为 NSNumber。因此,您以NSInteger myInt = myNumber.intValue 的形式访问该值。当您将其转换回来时,请使用NSNumber *myNumber = [NSNumber numberWithInt:myInt]。因为您忘记将NSNumber 转换为int,可能会出现这么大的数字(237371328)。希望这会有所帮助。

编辑:

试试:

NSInteger timesUsedAsInt = [[currentUseData valueForKey:@"timesAsNumber"] intValue];
NSLog(@"times As Number now reads: %ld", (long)timesUsedAsInt);

【讨论】:

  • 非常感谢 Levi,您建议的代码运行良好。我没想到看似简单的 pList 和托管对象会像 NSNumber 一样复杂。我相信您对非常大整数的起源是正确的:我想我将 NSNumber 对象的 2 个随机字节推入一个 int 变量的空间并得到了垃圾!
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 2017-03-03
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多