NSNumber,NSValue和NSData之間有什么區(qū)別?分別應(yīng)用在什么地方?

我們?cè)诰幋a中,很多時(shí)候需要將C里面原生的數(shù)據(jù)封裝成對(duì)象,這樣可以用NSDictionary或者NSArray來(lái)存取訪問(wèn)。尤其是一些做適配的情況下,這種封裝是不可避免的。Objective-C提供了不少類可以幫助我們,比較常見(jiàn)的是NSNumber,NSValue和NSData。

NSNumber主要是用來(lái)封裝ANSI C內(nèi)置的數(shù)據(jù),比如char,float,int等等。

這個(gè)類提供了一批封裝/解封的方法

+ (NSNumber *)numberWithChar:(char)value;

+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;

+ (NSNumber *)numberWithShort:(short)value;

+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;

+ (NSNumber *)numberWithInt:(int)value;

+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;

+ (NSNumber *)numberWithLong:(long)value;

+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;

- (char)charValue;

- (unsigned char)unsignedCharValue;

- (short)shortValue;

- (unsigned short)unsignedShortValue;

- (int)intValue;

- (unsigned int)unsignedIntValue;

- (long)longValue;

- (unsigned long)unsignedLongValue;

寫(xiě)起來(lái)一般就是:

NSNumber *number = [NSNumber numberWithInt: 1234];

int i = [number intValue];

NSValue主要用來(lái)封裝自定義的數(shù)據(jù)結(jié)構(gòu),可以是系統(tǒng)框架提供的CGRect/CGPoint/CGSize等數(shù)據(jù)結(jié)構(gòu),也可以是自己定義的struct。

這個(gè)類提供的封裝/解封方法

+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;

- (void)getValue:(void *)value;

例如:

typedef struct testTag

{

int ?a;

char *b;

}TEST_DATA_ST;

-- ?定義數(shù)據(jù)結(jié)構(gòu)

TEST_DATA_ST stValue = {0};

stValue.a = 58;

-- ?生成數(shù)據(jù)結(jié)構(gòu),并賦初值

NSValue *value = [NSValue valueWithBytes:&stValue objCType:@encode(TEST_DATA_ST)];

-- ?封裝,注意type類型使用@encode來(lái)包裝

TEST_DATA_ST testValue = {0};

[value getValue:&testValue];

-- ?解封,獲得數(shù)據(jù)

同時(shí),針對(duì)很常見(jiàn)CGRect/CGPoint/CGSize等數(shù)據(jù)結(jié)構(gòu),提供了封裝好的接口

+ (NSValue *)valueWithCGPoint:(CGPoint)point;

+ (NSValue *)valueWithCGSize:(CGSize)size;

+ (NSValue *)valueWithCGRect:(CGRect)rect;

- (CGPoint)CGPointValue;

- (CGSize)CGSizeValue;

- (CGRect)CGRectValue;

需要指出一下,NSNumber實(shí)際上是NSValue的一個(gè)特殊情況,所以在類關(guān)系中,NSNumber是NSValue的子類。

NSData主要是提供一塊原始數(shù)據(jù)的封裝,方便數(shù)據(jù)的封裝與流動(dòng),比較常見(jiàn)的是NSString/NSImage數(shù)據(jù)的封裝與傳遞。在應(yīng)用中,最常用于訪問(wèn)存儲(chǔ)在文件中或者網(wǎng)絡(luò)資源中的數(shù)據(jù)。

這個(gè)類提供的封裝/解封方法

+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length;

- (NSUInteger)length;

- (const void *)bytes NS_RETURNS_INNER_POINTER;

從這幾個(gè)方法可以看出,NSData根本不管傳遞的內(nèi)容到底是什么,僅僅是傳遞一塊內(nèi)存 —— 僅需內(nèi)存的起始地址和長(zhǎng)度

例如:

char *str = "Hello, World!";

NSData *strData = [NSData dataWithBytes:str length:strlen(str)+1];

-- 封裝

NSString *str = [NSString stringWithUTF8String:[strData bytes]];

[strData bytes]就可以獲得傳遞的內(nèi)容

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容