今天整理了iOS中相比较难一点的知识,但是作为一个iOS开发者,必须要掌握的技术点。下面我来描述下runtime机制
一、消息转发机制
1、当消息发送一个对象时,他的依次执行顺序
2、从运行时系统缓存使用过的方法中寻找
3、objc_msgSend通过对象的isa指针获取到类的结构体,然后在方法分发表里面查找方法的selector。
4、objc_msgSend结构体中的指向父类的指针找到其父类,并在父类的分发表里面查找方法的selector
5、依此,会一直沿着类的继承体系到达NSObject类
6、如果最后没有定位到selector,则会走消息转发流程
1)、动态方法解析
对象在接收到未知的消息时,首先会调用所属类的类方法
+resolveInstanceMethod:
(实例方法)或者
+resolveClassMethod:
(类方法)。
返回的是一个bool值:
YES
消息已处理
NO
消息未处理,进入备用接收者
2)、备用接收者
- (id)forwardingTargetForSelector:(SEL)aSelector
返回值是否为nil
nil为没有备用接收者,只能走完整消息转发了
非nil 作为消息的新接收者(不能是self本身,会出现死循环)
3)、完整消息转发
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation
返回nil为不处理,只能崩溃了
非nil,若有方法签名,会转发到其他对象处理
二、方法交换
正常情况下,一个方法名对应一个IMP指针
如图所示:
image.png方法交换后
方法名对应的IMP指针和其他的方法名对应的IMP指针做了交换
如图:
image.png感谢博主详细讲解:----------
网友评论