在objective-c,(NSInteger)VS中输入类型。 integerValue

时间:2015-06-23 07:25:25

标签: ios xcode casting

我不太了解(NSInteger)aNumberValue[aNumberValue integerValue]之间的差异,然后做一些测试。例如,以下是来自服务器的响应数据:

enter image description here

您可以看到它是一个int,但该值由NSNumber保留。我通过写NSInteger count = (NSInteger) dic[@"count"];来检索数据,并在Xcode调试区域中看到:

enter image description here

这真是一个奇怪的价值,但当我运行po count并看到这个:

enter image description here

无论如何,价值是正确的,但另一个奇怪的事情是:

enter image description here

数字2不小于100!

然后我尝试NSInteger a = [dic[@"count"] integerValue]并在Xcode调试区域中看到正常值:

enter image description here

enter image description here

所以,我有点困惑,(NSInteger)aNumberValue[aNumberValue integerValue]之间的差异是什么?

2 个答案:

答案 0 :(得分:2)

根本问题是Objective-C集合类只能存储Objective-C对象,而不能存储floatintNSInteger等基本类型。

因此NSNumber提供了一种以对象形式存储数字和布尔值的机制。

402008592看起来像一个地址,因此它可能是包含NSNumber值的NSInteger对象。

不要对NSNSInteger的{​​{1}}前缀感到困惑;它们仍然是原始类型,而不是像NSUInteger这样的对象。

答案 1 :(得分:1)

NSNumber是一个班级; NSInteger只是typedef的{​​{1}},这是一种原始类型。

long是一个指针,这意味着dic[@"count"]拥有一个指向dic[@"count"]实例的地址。 NSNumber有一个名为NSNumber的方法,它返回integerValue作为NSInteger实例所代表的基础值。因此,您可以得出结论NSNumber为您提供[dic[@"count"] integerValue],这就是您从long中检索价值的方式。

您不会通过将NSNumber投射到NSNumber来检索NSInteger的值。那是因为我说dic[@"count"]是一个指针。所以通过写作

NSInteger count = (NSInteger) dic[@"count"];

您实际上是将指针本身投射到NSInteger,这与实际表示的值无关。您看到的值402008592只是指针值的十进制表示,这是一个地址。

命令po用于打印对象,因此lldb实际上会尝试在count的地址处打印出对象。这就是您使用2获得po的原因。您可以尝试p count,然后获得402008592

关于po count < 100:首先评估表达式(count < 100);由于count实际上只是NSInteger的{​​{1}},因此会评估为402008592