美文网首页
OC 中的 @encode

OC 中的 @encode

作者: 何景根 | 来源:发表于2018-05-23 16:16 被阅读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

    來源:简书

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

    相关文章

      网友评论

          本文标题:OC 中的 @encode

          本文链接:https://www.haomeiwen.com/subject/qiuddftx.html