OC的消息机制简单介绍
在OC的消息机制中主要分为三个阶段,分别为:
1、消息发送阶段:从类以及父类的方法缓存列表和方法列表查找方法。
2、动态解析阶段:在消息发送阶段没有找到方法,则会进入这个阶段,负责动态添加方法实现。
3、如果没有实现动态解析方法,则会进行消息转发阶段,将消息转发给可以处理消息的接受者来处理。
如果以上都没有实现就会报出找不到方法的崩溃。
一、消息转发
首先判断这个对象是不是nil,如果是就相当于直接break,如果有,则会通过对象的isa指针找到这个类,在缓存的方法列表中查找,如果有则执行,没有则去方法列表中查找,如果没有通过superclass找到父类,在父类的缓存方法列表和方法列表中查找。
二、上述没有找到就会进入动态方法解析
根据是对象方法还是类方法会调用不同的方法:
类方法:resolveClassMethod
实例方法:resolveInstanceMethod
在方法中通过class_addMethod,动态添加方法的实现。
三、消息转发
通过签名,runtime生成了一个新的对象NSInvocation,发送给了forwardInvocation方法,在这个方法中让另外一个对象执行最开始的方法。如果forwardingTargetForSelector返回值不为空,就会让这个转发的目标处理消息。如果为nil,则会methodSignatureForSelector返回一个方法签名会调用forwardInvocation方法,根据NSInvocation修改方法的对象(方法的调用者,方法名,以及方法的参数)即可。如果methodSignatureForSelector返回为nil,则会doseNotRecognizeSelector方法内部。
最后都没有实现就会崩溃,因为找不到方法的实现。