面试题答案
一键面试1. 类对象(Class)与元类(Meta Class)的语法关系
- 在Objective-C中,每个类都是一个
Class
类型的对象,类对象存储了实例变量的布局、方法列表、属性列表等与类相关的信息。每个实例对象通过isa
指针指向它所属的类对象。 - 元类(Meta Class)是存储类方法的地方。每个类都有一个对应的元类,元类也是一个对象,它的
isa
指针指向根元类。根元类的isa
指针指向自身。类对象的isa
指针指向其对应的元类。
2. 对内存管理的影响
- 创建大量对象时元类结构对内存占用的影响:
- 元类结构在内存中是相对固定的。每个类仅有一个对应的元类,即使创建大量该类的实例对象,元类所占用的内存不会随着实例数量的增加而增加。这是因为元类主要存储类方法、类级别的属性等信息,这些信息对于整个类而言是共享的。
- 例如,假设有一个
Person
类,无论创建100个还是1000个Person
类的实例对象,其对应的元类只有一个,元类所占用的内存始终是固定的。实例对象通过isa
指针指向类对象,进而间接关联到元类。这种设计避免了每个实例对象都重复存储类方法等信息,大大节省了内存。
3. 对性能优化的影响
- 频繁调用类方法时基于类对象和元类结构的性能优化:
- 方法查找机制:当调用一个类方法时,运行时系统首先通过类对象的
isa
指针找到对应的元类,然后在元类的方法列表中查找该类方法。为了提高性能,Objective-C运行时维护了一个方法缓存(Method Cache)。当一个类方法第一次被调用时,运行时系统会在元类的方法列表中查找并将找到的方法缓存到类对象的缓存列表中。下次再调用该类方法时,首先从缓存列表中查找,如果找到则直接调用,避免了再次在元类方法列表中遍历查找,大大提高了查找效率。 - 优化策略:
- 减少类方法数量:尽量避免在类中定义过多不必要的类方法。因为类方法存储在元类中,过多的类方法会增加元类方法列表的长度,进而增加方法查找的时间。
- 合理使用缓存:虽然运行时系统自动维护了方法缓存,但开发中应尽量保证类方法调用的局部性,即频繁调用的类方法尽量集中,这样可以充分利用缓存机制,减少方法查找的开销。例如,将相关的类方法组织在一起,避免频繁调用不同类的类方法,导致缓存命中率降低。
- 方法查找机制:当调用一个类方法时,运行时系统首先通过类对象的