MST
星途 面试题库

面试题:Objective-C协议(Protocol)的深度应用与底层原理

从Objective-C底层原理角度分析,协议是如何实现的?协议中的方法是如何被调用和解析的?在多个类遵循同一个协议且协议方法实现不同的情况下,系统是如何进行调度的?请深入阐述。
17.9万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

协议的实现原理

  1. 数据结构:在Objective - C底层,协议本质上是一个objc_object结构体,其内部包含了协议的元数据,如协议名称、所声明的方法列表等信息。
  2. 类对协议的遵循:当一个类声明遵循某个协议时,会在类的元数据中记录所遵循的协议列表。这使得运行时系统能够知晓该类实现了哪些协议的方法。

协议方法的调用与解析

  1. 方法调用:当通过遵循协议的对象调用协议方法时,运行时系统会首先在对象所属类的方法列表中查找该方法的实现。
  2. 动态方法解析:如果在类的方法列表中未找到,运行时会进入动态方法解析阶段。它会尝试通过+ (BOOL)resolveInstanceMethod:(SEL)sel(实例方法)或+ (BOOL)resolveClassMethod:(SEL)sel(类方法)方法来动态添加方法实现。
  3. 备用接收者:若动态方法解析未成功,运行时会寻找备用接收者,即调用- (id)forwardingTargetForSelector:(SEL)aSelector方法,看是否能找到其他对象来处理该消息。
  4. 完整的消息转发:若仍未找到处理该消息的方式,会进入完整的消息转发流程,调用- (void)forwardInvocation:(NSInvocation *)anInvocation方法,开发者可以在此处手动构建消息转发逻辑。

多个类遵循同一协议且方法实现不同时的调度

  1. 基于对象类型:运行时系统根据对象的实际类型来决定调用哪个类的协议方法实现。因为每个类都有自己独立的方法列表,即使它们遵循同一个协议,不同类对协议方法的实现也会被独立存储在各自的方法列表中。
  2. 动态绑定:在运行时,消息发送机制会动态地根据对象的实际类型找到对应的方法实现。例如,假设有类ClassAClassB都遵循协议ProtocolX,并且都实现了协议中的methodInProtocol方法。当ClassA的实例调用methodInProtocol时,运行时会根据该实例是ClassA类型,去ClassA的方法列表中找到其对methodInProtocol的实现并调用;同理,当ClassB的实例调用时,会从ClassB的方法列表中查找并调用其实现。