iOS - NSValue 与 @encode

作者: Mitchell | 来源:发表于2015-10-26 22:34 被阅读2149次

    一、NSValue 很有用的包装对象的两个用法

        NSData*data = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:@"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 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


      MethodEcoding.png
    • 这里有需要注意的是:
      • 指针的标准编码是加一个前置的 ^,而 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 实例都用它来表示自己的类型。

    文章来源


    相关文章

      网友评论

        本文标题:iOS - NSValue 与 @encode

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