程序员

OC对象的分类

2018-03-20  本文已影响0人  coderLZ

写在前面

一些知识也许我们都知道,但是可能脉络不是很清晰,接下来就捋一捋这些容易绕晕的知识点。

不晕的外圈

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

1

instance的isa指向class,当调用对象方法时,通过instance的isa找的class,在class中找到对象方法的实现调用。
class 的isa 指向meta-class,当调用类方法时,通过class的isa找到meta-class,在meta-class中找到类方法的实现调用。

注:实例对象isa地址不是直接对应类对象的地址,类对象的isa地址也不是直接对应元类对象 的地址,在64bit开始,isa需要进行一次位运算才能计算出真正地址。

2.png

当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找父类

写在最后

捋顺了这些知识点,再看到一些面试题的时候就能沉着应对了!

上一篇下一篇

猜你喜欢

热点阅读