runtime 一般都是针对系统的类,导入头文件<objc/message.h> 设置build setting中msg开关
clang -rewrite-objc main.m 查看最终生成代码cpp
Person *p = objc_msgSend(objc_getClass(“Person”), sel_registerName(“alloc”));
Person *p = objc_msgSend([Person class], @select(“alloc”)];
objc_msgSend(p, @select(run:), 20); //方法带参数
方法调用流程:
对象方法:保存在类对象的方法列表中,
类方法:保存在元类的方法列表中
1.通过isa指针去对应的类中查找,
2.注册方法编号,根据方法编号查找对应的方法
3.找到最终的方法地址,根据地址去方法区调用方法。
什么时候需要用到runtime,消息机制
1.可以帮忙调用私有方法,不需要在头文件声明
2.只要想修改系统的方法实现,交换方法
交换方法是:1.给系统的方法添加分类,2.自己实现一个带有扩展功能的方法,3.交换方法
3.动态添加方法
任何方法默认都有两个隐式参数,self,_cmd
+ (BOOL)resolveInstanceMethod:(SEL)sel 动态添加方法,处理未实现
什么时候调用:只要一个对象调用了一个未实现的方法就会调用这个方法,进行处理
4.动态添加属性 :给系统的类添加属性objc_setAssociatedObject