面试题答案
一键面试优化方案一:优化类的缓存
- 对类运行时结构的改变:
- 类的缓存(cache)用于存储最近调用过的方法。当一个方法被调用时,首先会在缓存中查找,如果找到则直接执行,避免遍历整个方法列表。通过扩大缓存的大小,可以增加缓存命中率。在Objective - C的runtime中,缓存结构是
cache_t
,可以通过runtime相关函数操作缓存。例如,可以通过修改cache_t
的相关成员变量来调整缓存容量(虽然直接修改成员变量不是推荐的做法,但在理解原理上可以这么分析)。
- 类的缓存(cache)用于存储最近调用过的方法。当一个方法被调用时,首先会在缓存中查找,如果找到则直接执行,避免遍历整个方法列表。通过扩大缓存的大小,可以增加缓存命中率。在Objective - C的runtime中,缓存结构是
- 性能提升原理:
- 当缓存命中率提高时,方法调用的查找时间大大减少。因为不必每次都去遍历方法列表,直接从缓存中就能找到目标方法的入口,从而提升了方法调用的性能。特别是在大型项目中,很多类的方法可能会被高频调用,优化缓存能显著减少方法查找的开销。
优化方案二:合理设计类的继承结构
- 对类运行时结构的改变:
- 类的继承关系会影响方法查找的路径。在Objective - C中,每个类都有一个
isa
指针指向其元类,元类中存储类方法。当实例方法调用时,从类的方法列表开始查找,如果找不到则沿着继承链向上查找。合理设计继承结构,避免过深的继承层次,可以缩短方法查找路径。例如,将一些常用的方法放在更靠近子类的父类中,减少查找时向上追溯的层数。同时,在runtime层面,这会影响到方法查找时遍历的类的数量和顺序。
- 类的继承关系会影响方法查找的路径。在Objective - C中,每个类都有一个
- 性能提升原理:
- 较短的方法查找路径意味着在查找方法时需要遍历的方法列表数量减少,从而加快了方法查找速度。在大型项目中,复杂的继承结构可能导致方法查找开销增大,优化继承结构可以减少这种开销,提升类实例化后的方法调用性能。
优化方案三:懒加载实例变量
- 对类运行时结构的改变:
- 类的实例变量存储在实例对象的内存空间中。通过懒加载实例变量,在需要使用时才进行初始化,而不是在实例化类时就分配内存。在runtime层面,这意味着在实例化时部分实例变量的内存空间并未立即分配,减少了实例化时的内存开销。同时,懒加载机制可以通过关联对象等runtime特性来实现,这可能会涉及到runtime中
objc_setAssociatedObject
等函数的使用,关联对象的存储结构也会对类的运行时结构产生一定影响(关联对象存储在一个全局的哈希表中,通过对象的isa
指针和关联的key来查找)。
- 类的实例变量存储在实例对象的内存空间中。通过懒加载实例变量,在需要使用时才进行初始化,而不是在实例化类时就分配内存。在runtime层面,这意味着在实例化时部分实例变量的内存空间并未立即分配,减少了实例化时的内存开销。同时,懒加载机制可以通过关联对象等runtime特性来实现,这可能会涉及到runtime中
- 性能提升原理:
- 减少实例化时的内存分配,使得类的实例化过程更快。在大型项目中,类可能包含大量的实例变量,如果全部在实例化时初始化,会占用较多的内存和时间。懒加载只在实际使用变量时才进行初始化,提高了内存使用效率和实例化性能。