Object_c 的方法调用是一个消息转发的过程, 而不是像c++ 是通过直接的函数指针的调用机制。
比如:
[obj onClick]
类似于 执行下面的函数 objc_msgSend(obj, onClick)
实际上是有几个步骤:
1. 通过 obj 的 isa 指针找到对应 的 Class 信息。
这个 class 信息其实 是一个 obj_class 的struct 结构。
通过这个 class 结构,能找到对应的 objc_method_list
2. 通过 method_list 查找 对应的 Method
SEL 是一个字符串,映射到 方法名称
IMP 是 函数指针,真正的函数地址
如果能找到,那么就调用 这个方法的 imp , 返回 imp 的返回值
如果没有找到, 则到下一步。
3. 如果没有找到 对应的方法 , 那么上溯查找 super class 的 这个onClick Method。 如果一直都没有,那么就到最开始的 root class, 比如 NSObject.
如果最后也没有找到对应的 objc_method, 而且没有使用下面所说的3种消息处理机制,那么会抛 异常doesNotRecognizeSelector
那么是哪三种消息机制可以处理 对象给不存在的onClick 方法发消息,而不crash 的机制呢?
1. 动态解析机制
+(BOOL) resolveInstanceMethod:(SEL) sel
2. 备用接收者 机制
- (id) forwardingTargetForSelector:(SEL) sel
3. 完整消息转发 机制
-(NSMethodSignature *) methodSignatureForSelector : (SEL) sel
处理流程图如下:
这3中处理机制的示例, 我们下篇解析。