MST

星途 面试题库

面试题:Objective-C中类对象与元类的基本关系

请阐述在Objective-C中,类对象(Class)和元类(Meta Class)之间的关系,包括它们在内存中的存在形式以及如何通过它们来实现方法调度。
42.3万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

类对象(Class)和元类(Meta Class)的关系

  1. 类对象:每个类在运行时会有一个对应的类对象。它存储了该类的实例变量布局、实例方法列表、协议列表等信息。类对象用于创建类的实例。
  2. 元类:元类是存储类方法的地方。每个类都有一个唯一的元类,元类本身也是一个类对象,它继承自它类对象的超类的元类。例如,如果类A继承自类B,那么A的元类继承自B的元类。
  3. 关系总结:类对象存储实例方法,元类存储类方法。元类的isa指针指向它的父类的元类,最终形成一个继承体系。根元类(如NSObject的元类)的isa指针指向自身,从而形成闭环。

内存中的存在形式

  1. 类对象:在内存中占据一定空间,包含类的基本信息,如类名、实例变量信息、指向元类的isa指针等。类对象在程序启动时加载到内存中,且在整个程序运行期间保持存在。
  2. 元类:同样在内存中有其存在形式,和类对象类似,包含类方法列表等信息。元类也在程序启动时加载,伴随程序运行。

方法调度

  1. 实例方法调度:当一个实例调用实例方法时,实例的isa指针指向类对象,类对象根据方法选择器(selector)在实例方法列表中查找对应的方法实现。如果找不到,会沿着类的继承体系向上查找,直到找到或到达根类NSObject
  2. 类方法调度:当一个类调用类方法时,类的isa指针指向元类,元类根据方法选择器在类方法列表中查找对应的方法实现。若找不到,会沿着元类的继承体系向上查找,直到找到或到达根元类。根元类也继承自NSObject类对象,所以类方法最终也可能在NSObject的实例方法中找到实现(如description方法在类方法调用时也可使用)。