1.继ISA探锁后继续分析
上一节我们知道对象的内存地址的 前
8个字节 就是对象的isa其中isa中存储这各种信息,其中shiftcls是存的类的信息,这样就可以通过对象来找出对应的类,我们把类的指针信息,再进行x/4gx 分析下 类是否也会有isa
2.我们来分析下 类的isa是否也存在
2.1 看以下代码:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>
#import "LGPerson.h"
#import "LGTeacher.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
LGPerson *p= [LGPerson alloc];
LGTeacher *t =[LGTeacher alloc];
NSObject *objc = [NSObject alloc];
//NSObject 类
Class class = object_getClass(objc);
// NSObject元类
Class metaClass = object_getClass(class);
// NSObject 根元类
Class rootClass = object_getClass(metaClass);
// NSObject 元类父类
Class o_superClass = class_getSuperclass(metaClass);
NSLog(@"\n%p NSObject实例对象\n%p 类\n%p 元类\n%p 根元类 \n%p 元类父类",objc, class, metaClass, rootClass, o_superClass);
//p 类
Class p_class = object_getClass(p);
// p元类
Class p_metaClass = object_getClass(p_class);
// p 根元类
Class p_rootClass = object_getClass(p_metaClass);
// p 元类父类
Class p_superClass = class_getSuperclass(p_metaClass);
NSLog(@"\n%p LGPerson实例对象\n%p 类\n%p 元类\n%p 根元类 \n%p 元类父类",p, p_class, p_metaClass, p_rootClass, p_superClass);
//t 类
Class t_class = object_getClass(t);
// p元类
Class t_metaClass = object_getClass(t_class);
// p 根元类
Class t_rootClass = object_getClass(t_metaClass);
// p 元类父类
Class t_superClass = class_getSuperclass(t_metaClass);
NSLog(@"\n%p LGTeacher实例对象\n%p 类\n%p 元类\n%p 根元类 \n%p 元类父类",t, t_class, t_metaClass, t_rootClass, t_superClass);
}
return 0;
}
分析代码
LGTeacher继承与LGPerson其中object_getClass是获取元类的方法class_getSuperclass获取父类的方法.我们分别打印出 NSObject、LGPerson、LGTeacher的 对象 类 元类 根元类的地址信息。
2.2结果如下图
3.结论
isa的走向: 子类和父类的根元类是指向NSObject的根元类的NSObject的根元类指向自己. 继承走向: 子类继承父类,父类继承于NSObject元类继承父类的元类,父类的元类继承于NSObject元类,NSObject元类继承类NSObject走势图如下: