一、消息查找
在Objective-C中调用一个对象的方法,如:[aObject doSomeThing],会被被编译成一个C语言函数objc_msgSend(...)的调用,当objc_msgSend(...)执行时,会进行一系例的消息查找操作,目的是找到doSomeThing所对应的函数并执行;
整个消息查找过程如下:
运行时研究-消息查找.jpg
二、动态方法决议与消息转发
当经过消息查找阶段后仍没有匹配的函数时,会进行下面的过程:
- 如果doSomeThing是实例方法,OC的运行时会调用aObject 的
- (BOOL)resolveInstanceMethod:(SEL)sel
;
如果doSomeThing是类方法,则会调用aObject 的+ (BOOL)resolveClassMethod:(SEL)sel
;
resolveInstanceMethod:和resolveClassMethod可以让我们在程序运行时动态的为一个selector提供实现; - 如果我们在这两个方法中添加了函数的实现,并返回YES,运行时系统会重启一次消息的发送过程,这次便可以调用动态添加的方法;
如果我们在这两个方法中返回NO,将会进行消息转发;
整个决议与转发过程如下:
运行时研究-消息转发.jpg