写在前面
一些知识也许我们都知道,但是可能脉络不是很清晰,接下来就捋一捋这些容易绕晕的知识点。
不晕的外圈
OC 对象主要可分为三种:
instance对象——实例对象
就是通过类alloc出来的对象。
每一个alloc出来的对象都是不同的对象,分别占据着不同的地址。
实例对象在内存中存储的信息包括:
-> isa指针
-> 其他成员变量的值
class对象——类对象
每个类在内存中有且只有一个class对象。
可以通过以下方式获得类对象
Class cls1 = [p class];
Class cls2 = [Person class];
Class cls3 = object_getClass(p);
类对象在内存中存储的信息主要包括:
-> isa指针
-> superclass指针
-> 类的属性信息,类的对象放方法信息
-> 类的协议信息、类的成员成员变量
meta-class对象 ——元类对象
每个类在内存中有且只有一个元类对象,可以通过以下方式获得:
Class metaCls = object_getClass([Person class]);
元类对象和类对象的内存结构是一样的,但用途不一样,元类对象在内存中存储的信息主要包括:
-> isa指针
-> 类方法信息
注意:通过[NSObject class]class]是不能获得元类的!
易晕的内圈
那这三种对象是通过什么联系起来的呢:isa 和 superclass
1instance的isa指向class,当调用对象方法时,通过instance的isa找的class,在class中找到对象方法的实现调用。
class 的isa 指向meta-class,当调用类方法时,通过class的isa找到meta-class,在meta-class中找到类方法的实现调用。
2.png注:实例对象isa地址不是直接对应类对象的地址,类对象的isa地址也不是直接对应元类对象 的地址,在64bit开始,isa需要进行一次位运算才能计算出真正地址。
当Student的实例对象要调用Person的对象方法时,先通过isa找到Student的Class,然后通过Student的superclass找到Person的class,最后找到对象方法实现调用。
3.png
当Student的类对象调用Person的类方法时,先通过isa找到Student 的元类对象,在通过supercla找到Person的元类对象,最后找到方法实现调用。
网上流传经典的关系图:
4.png
总结:
instance的isa指向class
class的isa指向meta-class
meta-class的isa指向积累的meta-class
class的superclass指向父类的class,没有父类的指向nil
meta-class的superclass指向父类的meta-class
基类的meta-Class的superclass指向基类的class
instance调用对象方法的轨迹:isa找到class,方法不存在的话就通过superclass找父类
class调用类方法的轨迹:isa找打meta-class,方法不存在的话就通过superclass找父类
写在最后
捋顺了这些知识点,再看到一些面试题的时候就能沉着应对了!
网友评论