Runtime类型编码(Type Encoding)

①动态添加一个新类,并且给这个新类添加一个UIView的实例对象,然后打印出Type Encoding

    // 创建一个新类
    Class newClass = objc_allocateClassPair([NSObject class], "newClass", 0);
    // 给类添加实例变量
    class_addIvar(newClass, "_varA", sizeof(UIView *), log2(sizeof(UIView *)), @encode(UIView *));
    // 在应用中注册新类
    objc_registerClassPair(newClass);

    // 获取实例变量
    Ivar var_Instance = class_getInstanceVariable([newClass class], "_varA");
    // 获取成员变量名
    const char *name_var = ivar_getName(var_Instance);
    // 获取成员变量类型编码
    const char *type_var = ivar_getTypeEncoding(var_Instance);
    // 获取成员变量的内存偏移量
    ptrdiff_t offset_var = ivar_getOffset(var_Instance);
    
    NSLog(@"Ivar Name:%@ TypeEncoding:%s Offset:%td",[NSString stringWithUTF8String:name_var],type_var,offset_var);

运行结果:

Ivar Name:_varA TypeEncoding:@ Offset:8

②获取系统自带的类UIViewController里的成员变量_view,然后打印出Type Encoding

    // 获取实例变量
    Ivar var_Instance2 = class_getInstanceVariable([UIViewController class], "_view");
    // 获取成员变量名
    const char *name_var2 = ivar_getName(var_Instance2);
    // 获取成员变量类型编码
    const char *type_var2 = ivar_getTypeEncoding(var_Instance2);
    // 获取成员变量的内存偏移量
    ptrdiff_t offset_var2 = ivar_getOffset(var_Instance2);
    
    NSLog(@"Ivar Name:%@ TypeEncoding:%s Offset:%td",[NSString stringWithUTF8String:name_var2],type_var2,offset_var2);

运行结果:

Ivar Name:_view TypeEncoding:@"UIView" Offset:24

为什么①和②中,同样都是UIView的实例对象,打印的TypeEncoding不同呢?

你可能感兴趣的:(Runtime类型编码(Type Encoding))