面试题答案
一键面试类对象(Class)和元类(Meta Class)的关系
- 类对象:每个类在运行时会有一个对应的类对象。它存储了该类的实例变量布局、实例方法列表、协议列表等信息。类对象用于创建类的实例。
- 元类:元类是存储类方法的地方。每个类都有一个唯一的元类,元类本身也是一个类对象,它继承自它类对象的超类的元类。例如,如果类
A
继承自类B
,那么A
的元类继承自B
的元类。 - 关系总结:类对象存储实例方法,元类存储类方法。元类的isa指针指向它的父类的元类,最终形成一个继承体系。根元类(如
NSObject
的元类)的isa指针指向自身,从而形成闭环。
内存中的存在形式
- 类对象:在内存中占据一定空间,包含类的基本信息,如类名、实例变量信息、指向元类的isa指针等。类对象在程序启动时加载到内存中,且在整个程序运行期间保持存在。
- 元类:同样在内存中有其存在形式,和类对象类似,包含类方法列表等信息。元类也在程序启动时加载,伴随程序运行。
方法调度
- 实例方法调度:当一个实例调用实例方法时,实例的isa指针指向类对象,类对象根据方法选择器(selector)在实例方法列表中查找对应的方法实现。如果找不到,会沿着类的继承体系向上查找,直到找到或到达根类
NSObject
。 - 类方法调度:当一个类调用类方法时,类的isa指针指向元类,元类根据方法选择器在类方法列表中查找对应的方法实现。若找不到,会沿着元类的继承体系向上查找,直到找到或到达根元类。根元类也继承自
NSObject
类对象,所以类方法最终也可能在NSObject
的实例方法中找到实现(如description
方法在类方法调用时也可使用)。