NSNumber和NSValue對基礎C數據類型的對象化封裝

NSNumber和NSValue對基礎C數據類型的對象化封裝

作者:wangzz
轉載請註明出處
如果覺得文章對你有所幫助,請通過留言或關注微信公衆帳號wangzzstrive來支持我,謝謝!

由於Objective-C中常用的數據容器,如NSArray,NSDictionary等,只能處理Objective-C中的對象級別的數據類型,對於C中的很多數據類型,如int,float等,無法直接處理。針對這個問題,Objective-C提供了兩種存儲數據的對象NSNumber和NSValue,能將C中的基本數據類型,包括數值型和結構體型的數據轉化成Objective-C可以處理的對象。

NSNumber和NSValue都能將C中的基本數據類型轉化成Objective-C中的對象。

1、基本數據類型和NSValue

①基本數據類型轉化成NSValue

NSValue *value = [NSValue valueWithBytes:&result objCType:@encode(int)];
其中,result是基本數據的值,int是我們要轉化的基本數據類型

②NSValue轉化成基本數據類型

[value getValue:&result]; 

其中,value是一個NSValue類型的對象,result是一個已知的類型的基本數據類型。經過這樣的轉化,NSValue中保存的數值就放到了result中了。

2、基本數據類型和NSNumber

NSNumber是NSValue的子類,它的出現我理解的就是更加方便了除結構體以外的C中的基本數據類型和Objective-C中對象的相互轉化,NSNumber本身提供了很多類方法和實例方法,可以完成這些操作。

①基本數據類型轉化成NSNumber

NSNumber    *number = [NSNumber numberWithInt:3];

這樣就將int型的數據轉化成了NSNumber

②NSNumber轉化成基本數據類型

NSInteger   result = [number integerValue];

同樣十分方便,就取出了NSNumber中保存的數值。

3、NSInteger

在這裏順便提一句NSInteger吧,這是一個有符號型int,它與int的區別就在於NSInteger可以自動識別機器是32位還是64位。官方文檔是這樣寫的:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
#else
typedef int NSInteger;
#endif
另外,NSInteger的無符號版本是NSUInteger,官方文檔中如是定義:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef unsigned long NSUInteger;
#else
typedef unsigned int NSUInteger;
#endif

                                                                                                                                                                                                                      ----by wangzz 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章