2015-06-23 141 views
3

我不是很了解(NSInteger)aNumberValue[aNumberValue integerValue]之间的区别,然后做一些测试。例如,下面是来自服务器的响应数据:类型铸造在objective-c,(NSInteger)VS. 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]之间?

回答

1

NSNumber是一类; NSInteger只是一个typedeflong,这是一个原始类型。

dic[@"count"]是一个指针,这意味着dic[@"count"]拥有一个指向NSNumber实例的地址。 NSNumber有一个称为integerValue的方法,该方法返回NSInteger作为NSNumber实例表示的基础值。因此,您可以得出结论[dic[@"count"] integerValue]会让您获得long,这就是您如何从NSNumber中检索出该值的方法。

您不会通过将其转换为NSInteger来检索NSNumber的值。那是因为dic[@"count"],正如我所说,是一个指针。因此,通过写

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

你实际上是铸造指针本身NSInteger,这无关与实际值来表示。您看到的值402008592只是指针值的十进制表示形式,它是一个地址。

命令po用于打印对象,所以LLDB实际上将尝试在count地址打印出来的对象。这就是为什么你使用po返回2。你可以尝试p count,你会得到402008592

po count < 100:首先评估表达式(count < 100);由于count实际上只是402008592NSInteger,因此它将评估为false

+0

你的回答很明确,很有帮助,谢谢! – Allen

2

根本问题是Objective-C集合类只能存储Objective-C对象,而不是像基本类型float,intNSInteger

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

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

不要被NS的前缀NSIntegerNSUInteger混淆;它们仍然是原始类型,而不是像NSNumber这样的对象。

+0

为什么'count <100'返回false? – Allen

+0

@Allen我不是llvm的专家,但'po'只是打印对象的描述;我不相信它可以用来评估那样的表情。 – Droppy