我們在編碼中,很多時候需要將C裡面原生的數據封裝成對象,這樣可以用NSDictionary或者NSArray來存取訪問。尤其是一些做適配的情況下,這種封裝是不可避免的。Objective-C提供了不少類可以幫助我們,比較常見的是NSNumber,NSValue和NSData。
NSNumber主要是用來封裝ANSI C內置的數據,比如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主要用來封裝自定義的數據結構,可以是系統框架提供的CGRect/CGPoint/CGSize等數據結構,也可以是自己定義的struct。
這個類提供的封裝/解封方法
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
- (void)getValue:(void *)value;
例如:
typedef struct testTag
{
int a;
char *b;
}TEST_DATA_ST;
-- 定義數據結構
TEST_DATA_ST stValue = {0};
stValue.a = 58;
-- 生成數據結構,並賦初值
NSValue *value = [NSValue valueWithBytes:&stValue objCType:@encode(TEST_DATA_ST)];
-- 封裝,注意type類型使用@encode來包裝
TEST_DATA_ST testValue = {0};
[value getValue:&testValue];
-- 解封,獲得數據
同時,針對很常見CGRect/CGPoint/CGSize等數據結構,提供了封裝好的接口
+ (NSValue *)valueWithCGPoint:(CGPoint)point;
+ (NSValue *)valueWithCGSize:(CGSize)size;
+ (NSValue *)valueWithCGRect:(CGRect)rect;
- (CGPoint)CGPointValue;
- (CGSize)CGSizeValue;
- (CGRect)CGRectValue;
需要指出一下,NSNumber實際上是NSValue的一個特殊情況,所以在類關系中,NSNumber是NSValue的子類。
NSData主要是提供一塊原始數據的封裝,方便數據的封裝與流動,比較常見的是NSString/NSImage數據的封裝與傳遞。在應用中,最常用於訪問存儲在文件中或者網絡資源中的數據。
這個類提供的封裝/解封方法
+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length;
- (NSUInteger)length;
- (const void *)bytes NS_RETURNS_INNER_POINTER;
從這幾個方法可以看出,NSData根本不管傳遞的內容到底是什麼,僅僅是傳遞一塊內存 —— 僅需內存的起始地址和長度
例如:
char *str = "Hello, World!";
NSData *strData = [NSData dataWithBytes:str length:strlen(str)+1];
-- 封裝
NSString *str = [NSString stringWithUTF8String:[strData bytes]];
[strData bytes]就可以獲得傳遞的內容