2011-07-12 55 views
10

如果不能將整數寫入字典,然後寫入.plist,但NSNumbers可以更好地在整個應用程序中使用NSNumbers,而不需要將每次保存或從字典加載字典。 PLIST?NSNumber vs Int

+0

請注意,內存分配很昂貴。你可能想讓自己的類與NSNumber類似,這將是可變的。 – 2011-07-12 10:46:01

+0

將'NSInteger'優先於'int'。這在各種版本的OS X中都更加便於攜帶。 – mouviciel

+0

您可以簡單地用一個'NSNumber'(一個對象)替換一個「int」(一個「標量值」)。將每個數字量保存在一個「NSNumber」中並將其轉換爲每個計算的結果都是非常尷尬的。另一方面,使用'NSInteger'而不是'int'是一個合理的事情。 –

回答

8

這樣概括:只是POD類型的堅持,直到你需要使用的基於對象的表示,例如NSNumber。 POD的表現要好得多,但在某些情況下您需要NSNumber

在某些情況下,它可能是有意義的使用NSNumber代替 - 這通常是當你重用一個NSNumber往往 - 這是爲了避免一噸重複NSNumber S的。除了序列化和通用objc接口(綁定,變換器,字典)外,這種情況很少見。


更新/詳細信息:的ObjC運行時會在某些情況下,一些架構,並在一些操作系統版本替換爲標記指針代表NSNumber的具體類型和域的。儘管自從幾年前寫入以來,內部表示已經發生了變化,但這裏有一個很好的介紹:http://objectivistc.tumblr.com/post/7872364181/tagged-pointers-and-fast-pathed-cfnumber-integers-in。在可以使用的地方,它可以讓您免於緩慢的操作,如分配,鎖定和參考計數操作。儘管如此,帶標籤的指針不能代表每個數字,並且會引入開銷,因此您應該仍然默認使用基本內建函數而不是NSNumber。在適用的情況下,帶標記的指針是一種很好的優化,但是當你只需要號碼時,它們遠遠不能與內建的競爭。

+1

偉大的事情是,KVC支持自動裝箱,即標量類型和NSNumber之間的轉換,所以很少需要在屬性中使用NSNumber。 – DrMickeyLauer

+0

考慮到64位設備的影響,您可能需要修改此選項。 – user

+2

@用戶更新已添加 – justin

0

NSNumber是從NSValue包裝器對象繼承的對象。

int不是對象。

如果使用NSNumber你可以得到越來越多的功能與他們一起使用。

http://developer..com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html

的NSNumber是一個類,可以幫助你數值類型存儲爲對象。它具有在不同類型和方法之間進行轉換以檢索數值的字符串表示的方法。 如果您在示例中使用了類型爲NSNumber *的變量日期,則不會修改日期的值,而是修改其內存地址。

0

這一切都取決於你的需要。但是,如果API要求您使用int,則應該使用int。它要求您使用NSNumber您應該使用NSNumber

例如,如果您使用的是UISegmentedControl,你要選擇一個片段,然後,

[segmentedControl setSelectedSegmentIndex:aIntVar]; // Can not use NSNumber here 
// or 
[segmentedControl setSelectedSegmentIndex:[aNumber intValue]];