一恃轩、NSValue 很有用的包裝對(duì)象的兩個(gè)用法
NSData*data = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]];
/** 用 NSValue 包裝 Objective-C 對(duì)象 */
NSValue *value = [NSValue valueWithBytes:&data objCType:@encode(NSString)];
NSLog(@"%@",value);
/** NSValue 創(chuàng)建并返還一個(gè)包含給定對(duì)象的 */
NSObject*objc = [NSObject new];
NSValue * value2 = [NSValue valueWithNonretainedObject:objc];
NSLog(@"%@",value2);
二、關(guān)于 @encode
- 意義:@編譯器指令 之一叉跛,返回一個(gè)給定類型編碼為一種內(nèi)部表示的字符串(例如,@encode(int) → i)鸣峭,類似于 ANSI C 的 typeof 操作酥艳。蘋果的 Objective-C 運(yùn)行時(shí)庫(runtime)內(nèi)部利用類型編碼幫助加快消息分發(fā)。
Objective-C Type Encodings
編碼 意義
c ---> A char
i ---> An int
s ---> A short
l ---> A longl is treated as a 32-bit quantity on 64-bit programs.
q ---> A long long
C ---> An unsigned char
I ---> An unsigned int
S ---> An unsigned short
L ---> An unsigned long
Q ---> An unsigned long long
f ---> A float
d ---> A double
B ---> A C++ bool or a C99 _Bool
v ---> A void
"* ---> A character string (char *)(最前方的”是為了格式才添加)
@ ---> An object (whether statically typed or typed id)
"# ---> A class object (Class)(最前方的“是為了格式才添加)
: ---> A method selector (SEL)
[array type] ---> An array
{name=type...} ---> A structure
(name=type...) ---> A union
bnum ---> A bit field of num bits
^type ---> A pointer to type
? ---> An unknown type (among other things, this code is used for function pointers)
- 我們也可以嘗試去打印這些值
NSLog(@"int : %s", @encode(int));
NSLog(@"float : %s", @encode(float));
NSLog(@"float * : %s", @encode(float*));
NSLog(@"char : %s", @encode(char));
NSLog(@"char * : %s", @encode(char *));
NSLog(@"BOOL : %s", @encode(BOOL));
NSLog(@"void : %s", @encode(void));
NSLog(@"void * : %s", @encode(void *));
NSLog(@"NSObject * : %s", @encode(NSObject *));
NSLog(@"NSObject : %s", @encode(NSObject));
NSLog(@"[NSObject] : %s", @encode(typeof([NSObject class])));
NSLog(@"NSError ** : %s", @encode(typeof(NSError **)));
int intArray[5] = {1, 2, 3, 4, 5};
NSLog(@"int[] : %s", @encode(typeof(intArray)));
float floatArray[3] = {0.1f, 0.2f, 0.3f};
NSLog(@"float[] : %s", @encode(typeof(floatArray)));
typedef struct _struct {
short a;
long long b;
unsigned long long c;
} Struct;
NSLog(@"struct : %s", @encode(typeof(Struct)));
-
Method Ecoding
- 這里有需要注意的是:
- 指針的標(biāo)準(zhǔn)編碼是加一個(gè)前置的 ^,而 char * 擁有自己的編碼 *赫冬。這在概念上是很好理解的,因?yàn)?C 的字符串被認(rèn)為是一個(gè)實(shí)體膛薛,而不是指針补鼻。
- BOOL 是 c哄啄,而不是某些人以為的 i风范。原因是 char 比 int 小,且在 80 年代 Objective-C 最開始設(shè)計(jì)的時(shí)候锌半,每一個(gè) bit 位都比今天的要值錢(就像美元一樣)寇漫。BOOL 更確切地說是 signed char (即使設(shè)置了 -funsigned-char 參數(shù))刊殉,以在不同編譯器之間保持一致州胳,因?yàn)?char 可以是 signed 或者 unsigned。
- 直接傳入 NSObject 將產(chǎn)生 #遍膜。但是傳入 [NSObject class] 產(chǎn)生一個(gè)名為 NSObject 只有一個(gè)類字段的結(jié)構(gòu)體。很明顯瓢颅,那就是 isa 字段,所有的 NSObject 實(shí)例都用它來表示自己的類型惜索。