柳志超博客 » Program » Objective-C » Objective-C入門教程10:數字類型(NSInteger,NSUInteger,NSNumber)html
posted in Objective-C on 2012/12/14 by liuzcjava
在Objective-C中,咱們可使用c中的數字數據類型,int、float、long等。它們都是基本數據類型,而不是對象。也就是說,不可以向它們發送消息。而後,有些時候須要將這些值做爲對象使用。ios
NSInteger、NSUIntegerobjective-c
當你不知道程序運行哪一種處理器架構時,你最好使用NSInteger,由於在有可能int在32位系統中只是int類型,而在64位系統,int可能變是long型。除非不得不使用int/long型,不然推薦使用NSInteger。api
從上面的定義能夠看出NSInteger/NSUInteger是一種動態定義的類型,在不一樣的設備,不一樣的架構,有多是int類型,有多是long類型。數組
NSUInteger是無符號的,即沒有負數,NSInteger是有符號的。數據結構
NSNumber架構
有人說既然都有了NSInteger等這些基礎類型了爲何還要有NSNumber?
NSNumber能夠將基本數據類型包裝起來,造成一個對象,這樣就能夠給其發送消息,裝入NSArray中等。app
NSInteger intVal = 123; NSNumber *numberVal = [NSNumber numberWithInteger:intVal]; NSMutableArray* array = [NSMutableArray array]; [array addObject:intVal]; //錯誤,intVal不是一個對象類型 [array addObject:numberVal]; //正確
Cocoa提供了NSNumber類來包裝(即以對象形式實現)基本數據類型。post
+ (NSNumber*)numberWithChar: (char)value;+ (NSNumber*)numberWithInt: (int)value;+ (NSNumber*)numberWithDouble:(double)value;+ (NSNumber*)numberWithFloat: (float)value;+ (NSNumber*)numberWithBool: (BOOL) value;...
將基本類型數據封裝到NSNumber中後,就能夠經過下面的實例方法從新獲取它:
- (char)charValue;- (int)intValue;- (float)floatValue;- (double)doubleValue;- (BOOL)boolValue;...
NSValue類
咱們說像數組這樣的Foundation集合只能存儲對象,不能存儲像int這樣的基本數據類型.可是咱們每每也會有這樣的需求,例如須要將CGPoint或是CGRect這樣的結構存儲在集合中.一個NSValue對象是用來存儲一個C或者Objective-C數據的簡單容器。它能夠保存任意類型的數據,好比int,float,char,固然也能夠是指pointers, structures, and object ids。NSValue類的目標就是容許以上數據類型的數據結構可以被添加到集合裏.這種結構轉化爲對象的方式,不就是java中的裝箱(boxing)嗎?不過在Objective-C中稱爲包裝(wraping),相反的,從對象中解出基本類型,稱爲展開(unwraping),在java中叫拆箱(unboxing).
NSNumber 繼承自NSObject,可以使用compare、isEqual等消息。
NSNumber是NSValue的子類。NSValue可包裝任意類型值。
前面咱們也介紹了Objective-C中的一些特殊數據類型:Objective-C入門教程05:特殊數據類型
更多關於NSValue的信息能夠查看官方文檔:NSValue Class Reference
更多信息能夠參考:Foundation Data Types Reference