面试题答案
一键面试策略一:使用中间层类
- 实施步骤
- 创建一个中间层类,例如
IntermediateClass
。这个类作为冲突的类别和扩展所涉及功能的代理。 - 将原类别和扩展中冲突的方法和属性重新组织到
IntermediateClass
中。在原类中,通过创建IntermediateClass
的实例,并将对冲突方法和属性的调用转发给该实例。 - 对于属性,原类通过
IntermediateClass
实例来间接访问和修改属性值。对于方法,原类中实现简单的转发方法,调用IntermediateClass
实例对应的方法。
- 创建一个中间层类,例如
- 可能带来的影响
- 优点:完全解决了方法命名和属性声明的冲突问题,代码结构更加清晰,不同功能模块的职责划分更明确。同时,由于中间层类的隔离,对原类的修改较小,降低了修改原类带来的风险。
- 缺点:增加了额外的类和实例化操作,会增加一定的内存开销。同时,方法调用需要经过中间层转发,可能会稍微降低性能,特别是在高频调用场景下。另外,代码的复杂度有所提升,需要维护中间层类及其与原类的交互逻辑。
策略二:利用运行时动态解析
- 实施步骤
- 在类的
+ (BOOL)resolveInstanceMethod:(SEL)sel
(实例方法)或+ (BOOL)resolveClassMethod:(SEL)sel
(类方法)方法中,通过运行时动态添加方法实现。在这个方法中,判断sel
是否是冲突的方法。 - 如果是冲突的方法,根据不同的来源(类别或扩展),决定实际要调用的方法实现。可以通过自定义的映射表来记录不同
SEL
对应的实际实现。 - 对于属性,同样可以利用运行时的关联对象机制。在访问和设置属性时,通过运行时动态查找和设置关联对象来避免冲突。
- 在类的
- 可能带来的影响
- 优点:无需引入新的类,对现有代码结构侵入性较小。可以在运行时灵活地处理方法和属性的冲突,根据实际情况动态选择执行逻辑。
- 缺点:运行时的操作相对复杂,代码可读性和维护性较差。由于动态解析机制,在开发和调试过程中,很难直观地看出方法和属性的实际调用逻辑。并且,如果映射表管理不当,可能会导致运行时错误,排查问题难度较大。