isa指针指向哪里
1. isa指针指向哪里 super_class指针指向哪里
实例对象的isa指针指向类对象,类对象的isa指针指向元类对象,元类对象的isa指针指向基类
类的 super_class指针指向他的父类,父类指向父类......., 最后指向基类,基类指向nil
元类的 super_class指针指向他的父类(元类),父类(元类)指向父类(元类)......., 最后指向基类(元类),基类(元类)指向他的(类的)基类 ,(类)基类指向nil
1.2 先了解下 实例对象、类对象、元类对象
通过alloc创建实力对象
NSObject *object1 = [[NSObject alloc] init];
同过class创建类对象
Class cs = [NSObject Class]; 或是 Class cs = [object1 Class];
通过object_getClass()创建元类对象
Class metaCs = object_getClass(cs);
1.3 元类对象和类对象在内存中有且只有1份 看下面代码
1.4. 实例对象、类对象、元类对象都有isa指针
1.5. 看代码证明isa指向哪里
1.5.1 实例对象isa指针指向类对象 在64位之后 实例对象isa&ISA_MASK之后才能得到类的地址
1.5.2 类的isa指针指向元类对象 在64位之后 类对象isa&ISA_MASK之后才能得到元类的地址
为什么会报错? 因为class是一个结构体 ,结构体内存储的有isa指针 ,但是不能被外部调用, 看下面代码
接下来我们就写一个一摸一样的Class结构体,来证明类对象的isa指针指向元类对象 看代码
二 super_class指针指向哪里
1 类的 super_class指针指向他的父类,父类指向父类......., 最后指向基类,基类指向nil
基类指向nil 看代码证明
三 元类
元类的 super_class指针指向他的父类(元类),父类(元类)指向父类(元类)......., 最后指向基类(元类),基类(元类)指向他的(类的)基类 ,(类)基类指向nil
看下面代码证明
在网上找的大神的图公大家参考: