1).Runtime消息传递
1.通过hash算法,先从缓存中查找,找到,调用方法结束流程;
2.没有找到,则取当前类的方法列表中查找,找到,调用方法结束流程;
3.没有在当前类的方法列表中找到,则取逐级父类方法列表中查找,找到,调用方法,加入当前方法缓存中,再结束流程;
4.以上都没有找到,进入方法动态解析,转入消息转发流程。
2).消息转发流程:
1.调用动态解析方法resolveClassMethod:(SEL)sel,如果动态添加方法(调用class_addMethod函数)并返回YES,则流程结束;
2.函数上一步没有实现动态添加方法,不管返回YES or NO,都会调用消息接受者重定向forwardingTargetForSelector方法,如果返回重定向接受者,则当前流程结束;
3.如果返回上一步nil,则会调用methodSignatureForSelector获取函数的参数和返回值类型,同时调用forwardInvocation消息通知当前对象;
4.如果上一步返回nil,消息无法处理, App crash。
3).继承关系:
1.实例对象(instance)的isa指针指向类对象(class),类对象的存放实例方法(-);
2.类对象(class)的isa指针指向其元类对象(meta),元类对象存放方法(+);
3.根类对象(root class)的isa指针指向根元类对象(root meta),superclass指针指向nil;
4.根元类对象(root meta)的isa指针指向自己,superclass指针根类对象(root class);
总结:实例方法查找是沿着其superclass指针逐级父类查找,终于根类对象(root class)。而类方法(+方法)查找是沿着其superclass指针逐级父类(meta)查找,终于根类对象(root class),如果根类对象存在同名实例方法,则会调用同名实例方法
4).Runtime实际运用:
1.给NSTimer定时器声明一个中间类Proxy(消息转发);
2.通过runtime动态获取类的所有属性(json转model、可归档类对属性的归档及解归档操作);
3.反射机制(NSClassFromString,CTMediator原理);
4.交换系统方法(比如交换viewController声明周期方法,从而进行统一埋点等操作);
5.给分类添加属性(通过管关联对象,实现getter,setter方法);