OC 中的 @encode

2018-05-23  本文已影响0人  何景根

一、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

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇 下一篇

猜你喜欢

热点阅读