- 消息发送与转发
1.1 简介
OC的消息机制是通过runtime实现的,消息发送是通过selector快速查找IMP的过程;消息转发是在查找IMP失败是进行重新进行方法解析或转发的过程。如果查找IMP失败后不做转发处理或转发失败,程序会抛出异常unrecognized selector。
1.2 消息发送机制(Runtime快速查找IMP的过程)
1)通过实例变量的isa指针确定class
2)如果是实例方法,在class的methodLists里查找IMP,查找不到就到superclass里查找;如果是类方法,在metaclass里查找IMP,查找不到再到metaclass指向的的superclass里查找
3)为了提高查找效率在第二步查找之前其实是在class的cache里先查找,查不到后再执行第(2)步
4)一旦找到跳转到IMP指针指向的方法实现,执行函数。否则,开始转发。
1.3 Method, SEL, IMP, selector
SEL, IMP是OC关键字,Method的结构体为如下,通过@selector(name)把name转出SEL编号,让后在methodLists里找到对应的Method,在Method里找到IMP,通过IMP调用方法实现。消息发送中的message指的应该是@selector
image.png
1.4 转发过程
上面消息发送失败后会进行消息转发,包括3步
1)方法解析(Method resolution)
+ (BOOL)resolveInstanceMethod:(SEL)sel
+ (BOOL)resolveClassMethod:(SEL)sel
2)快速转发(Fast forwarding)
- (id)forwardingTargetForSelector:(SEL)aSelector
3)常规转发(Normal forwarding)
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation
1.5 Normal forwarding和Fast forwarding的区别
1)发送的消息不同
2)转发给的对象数量不同
1.6 应用
1)崩溃预防处理,把不可处理的消息转发统一处理了
2)多继承,









网友评论