我不太了解(NSInteger)aNumberValue
和[aNumberValue integerValue]
之间的差异,然后做一些测试。例如,以下是来自服务器的响应数据:
您可以看到它是一个int,但该值由NSNumber保留。我通过写NSInteger count = (NSInteger) dic[@"count"];
来检索数据,并在Xcode调试区域中看到:
这真是一个奇怪的价值,但当我运行po count
并看到这个:
无论如何,价值是正确的,但另一个奇怪的事情是:
数字2不小于100!
然后我尝试NSInteger a = [dic[@"count"] integerValue]
并在Xcode调试区域中看到正常值:
和
所以,我有点困惑,(NSInteger)aNumberValue
和[aNumberValue integerValue]
之间的差异是什么?
答案 0 :(得分:2)
根本问题是Objective-C集合类只能存储Objective-C对象,而不能存储float
,int
或NSInteger
等基本类型。
因此NSNumber
提供了一种以对象形式存储数字和布尔值的机制。
值402008592
看起来像一个地址,因此它可能是包含NSNumber
值的NSInteger
对象。
不要对NS
和NSInteger
的{{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
。