方法调用阶段
[receiver selector]被编译为objc_msgSend(receiver, selector, org1, org2)
1、通过receiver的isa指针找到receiver所属的class(类);
2、在receiver所属的method_list(方法列表)中找到对应的selector(先找缓存列表再找方法列表);
3、如果在Class中没有找到selector对应的实现,就去superClass(父类)方法列表中查找;
4、如果找到对应selector,则直接执行receiver中的selector方法的实现;
5、如果找不到对应的selector,消息将被转发或者临时向receiver添加这个selector对应的实现,否则就会crash;
消息转发
在继承关系中找不到方法实现时,程序就会crash,但是在crash之前我们还可以重写以下四个方法进行处理。
// 当调用一个不存在的类方法时调用,通过调用class_addMethod方法添加方法实现,return YES
+ (BOOL)resolveClassMethod:(SEL)sel;
// 当调用一个不存在的实例方法时调用,通过调用class_addMethod方法添加方法实现,return YES
+ (BOOL)resloveInstanceMethod:(SEL)sel;
// 快速转发,将这个方法转发给其它类进行处理,返回一个类的实例
- (id)forwardingTargetForSelector:(SEL)selector;
// 获取方法签名
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
// 将不存在的方法打包成NSInvocation,需要用invokeWithTarget:给某个能执行该方法的实例
- (void)forwardInvocation:(NSInvocation *)anInvocation;