①动态添加一个新类,并且给这个新类添加一个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不同呢?