一、NSValue 很有用的包装对象的两个用法
NSData*data = [[NSDataalloc]initWithContentsOfURL:[NSURLURLWithString:@"www.baidu.com"]];
/** 用 NSValue 包装 Objective-C 对象 */
NSValue*value = [NSValue valueWithBytes:&data objCType:@encode(NSString)];
NSLog(@"%@",value);
/** NSValue 创建并返还一个包含给定对象的 */
NSObject*objc = [NSObject new];
NSValue* value2 = [NSValue valueWithNonretainedObject:objc];
NSLog(@"%@",value2);
二、关于 @encode
意义:@编译器指令 之一,返回一个给定类型编码为一种内部表示的字符串(例如,@encode(int) → i),类似于 ANSI C 的 typeof 操作。苹果的 Objective-C 运行时库(runtime)内部利用类型编码帮助加快消息分发。
Objective-C Type Encodings编码意义 :
c ---> A char
i ---> An int
s ---> A short
l ---> A long
l 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 ---> Afloat
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)
[arraytype] ---> An array
{name=type...} ---> A structure
(name=type...) ---> A union
bnum ---> A bit field of num bits
^type---> A pointer totype
? ---> An unknowntype(among other things, this code is usedforfunctionpointers)
我们也可以尝试去打印这些值
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([NSObjectclass])));
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
这里有需要注意的是:
指针的标准编码是加一个前置的 ^,而 char * 拥有自己的编码 *。这在概念上是很好理解的,因为 C 的字符串被认为是一个实体,而不是指针。
BOOL 是 c,而不是某些人以为的 i。原因是 char 比 int 小,且在 80 年代 Objective-C 最开始设计的时候,每一个 bit 位都比今天的要值钱(就像美元一样)。BOOL 更确切地说是 signed char (即使设置了 -funsigned-char 参数),以在不同编译器之间保持一致,因为 char 可以是 signed 或者 unsigned。
直接传入 NSObject 将产生 #。但是传入 [NSObject class] 产生一个名为 NSObject 只有一个类字段的结构体。很明显,那就是 isa 字段,所有的 NSObject 实例都用它来表示自己的类型
作者:Mitchell
链接:https://www.jianshu.com/p/0e6626d3614c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论