[英]type casting in objective-c, (NSInteger) VS. integerValue
我不太了解(NSInteger)aNumberValue
和[aNumberValue integerValue]
之間的差異,然后做一些測試。 例如,以下是來自服務器的響應數據:
您可以看到它是一個int,但該值由NSNumber保持。 我通過寫NSInteger count = (NSInteger) dic[@"count"];
檢索數據NSInteger count = (NSInteger) dic[@"count"];
,在Xcode調試區,看到了這個:
這真是一個奇怪的價值,但當我運行po count
並看到這個:
無論如何,價值是正確的,但另一個奇怪的事情是:
數字2不小於100!
然后我嘗試NSInteger a = [dic[@"count"] integerValue]
並在Xcode調試區域中看到正常值:
和:
所以,我有點困惑, (NSInteger)aNumberValue
和[aNumberValue integerValue]
之間的差異是什么?
根本問題是Objective-C集合類只能存儲Objective-C對象,而不是像float
, int
或NSInteger
這樣的原始類型。
因此, NSNumber
提供了一種以對象形式存儲數字和布爾值的機制。
值402008592
看起來像一個地址,因此它可能是一個包含NSInteger
值的NSNumber
對象。
不要被弄糊塗NS
的前綴NSInteger
和NSUInteger
; 它們仍然是原始類型,而不是像NSNumber
這樣的對象。
NSNumber
是一個類; NSInteger
只是long
的typedef
,它是一種原始類型。
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
實際上只是一個402008592
的NSInteger
,它將評估為false
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.