簡體   English   中英

在objective-c,(NSInteger)VS中輸入類型。 integerValue

[英]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對象,而不是像floatintNSInteger這樣的原始類型。

因此, NSNumber提供了一種以對象形式存儲數字和布爾值的機制。

402008592看起來像一個地址,因此它可能是一個包含NSInteger值的NSNumber對象。

不要被弄糊塗NS的前綴NSIntegerNSUInteger ; 它們仍然是原始類型,而不是像NSNumber這樣的對象。

NSNumber是一個類; NSInteger只是longtypedef ,它是一種原始類型。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM