我們在編碼中肾筐,很多時候需要將C里面原生的數(shù)據(jù)封裝成對象,這樣可以用NSDictionary或者NSArray來存取訪問袖裕。尤其是一些做適配的情況下燎猛,這種封裝是不可避免的恋捆。Objective-C提供了不少類可以幫助我們,比較常見的是NSNumber重绷,NSValue和NSData沸停。
NSNumber主要是用來封裝ANSI C內(nèi)置的數(shù)據(jù),比如char昭卓,float愤钾,int等等。
這個類提供了一批封裝/解封的方法
+ (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;
寫起來一般就是:
NSNumber *number = [NSNumber numberWithInt: 1234];
int i = [number intValue];
NSValue主要用來封裝自定義的數(shù)據(jù)結(jié)構(gòu)候醒,可以是系統(tǒng)框架提供的CGRect/CGPoint/CGSize等數(shù)據(jù)結(jié)構(gòu)能颁,也可以是自己定義的struct。
這個類提供的封裝/解封方法
+ (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來包裝
TEST_DATA_ST testValue = {0};
[value getValue:&testValue];
-- ?解封,獲得數(shù)據(jù)
同時敌土,針對很常見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的一個特殊情況返干,所以在類關(guān)系中谦疾,NSNumber是NSValue的子類。
NSData主要是提供一塊原始數(shù)據(jù)的封裝犬金,方便數(shù)據(jù)的封裝與流動,比較常見的是NSString/NSImage數(shù)據(jù)的封裝與傳遞。在應(yīng)用中晚顷,最常用于訪問存儲在文件中或者網(wǎng)絡(luò)資源中的數(shù)據(jù)峰伙。
這個類提供的封裝/解封方法
+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length;
- (NSUInteger)length;
- (const void *)bytes NS_RETURNS_INNER_POINTER;
從這幾個方法可以看出,NSData根本不管傳遞的內(nèi)容到底是什么该默,僅僅是傳遞一塊內(nèi)存 —— 僅需內(nèi)存的起始地址和長度
例如:
char *str = "Hello, World!";
NSData *strData = [NSData dataWithBytes:str length:strlen(str)+1];
-- 封裝
NSString *str = [NSString stringWithUTF8String:[strData bytes]];
[strData bytes]就可以獲得傳遞的內(nèi)容