runtime
runtime 运行时,我们在编译时还未确定对象类型以及执行方法,而是在运行时才确定对象类型,而每一个方法调用都是一种消息发送,通过方法名 sel 查找确定的方法实现 IMP
Person *p = [Person alloc]
p 实例对象 通过 isa 去类对象 Person 中查找方法:进行 CacheLookup 去缓存中快速查找 IMP, 找到后进行寻址调用 IMP 指向的地址,找不到则返回_objc_msgSend_uncached,进入慢速查找 如果还没有查找到则进入动态决议-消息转发流程
objc_msgSend流程图
cache_t 缓存查找
mehod_list 查找
先查类方法列表-> 父类缓存列表中->父类方法列表....->根类 NSObject 方法列表 -> nil
通过二分法查找,找到后返回 IMP,同时写入 cache_t表中。
消息转发流程
动态解析:
-resolveInstanceMethod:实现这个方法,把方法通过动态解析添加进去就会避免崩溃
快速转发:
-forwardingTargetForSelector:
常规转发:
-methodSignatureForSelector:
-forwardingInvocation:
没有找到方法,抛出异常:
-doesNotRecognizeSelector: