1.什么是运行时?
1>概念
运行时是一套纯C语言的API
2>编译查看
实际上编译器最终都会将OC代码转为运行时代码(也可手动编译,终端执行:clang -rewrite-objc xxx.m)
3>具体应用:运用运行时函数,实现一些底层的操作,比如
* 将某些OC代码转为运行时代码:比如查看block的实现原理
* 拦截系统自带的方法调用,实现Method Swizzling,比如拦截imageNamed,loadView等
* 可实现字典和模型的自定转换,解决KVC的不足,比如MJExtension框架
* 可实现分类添加属性,默认分类中property修饰的变量只能生成setter和getter的声明,不能生成其实现
* 可实现NSCoding的自动归档和自动解档
2.运行时常用的C函数及应用
1>导入函数库<objc/runtime.h>
* Method class_getClassMethod(Class cls,SEL name)
获取某个类的类方法
* Method class_getInstanceMethod(Class cls,SEL name)
获取某个类的对象方法
* void method_exchangeImplementations(Method m1,Method m2);
交换m1和m2的实现
* void objc_setAssociatedObject(id object, const void *key,id value,objc_AssociationPolicy policy)
设置对象object中的健值关联(将对象中的value和key关联)
参数value:将value存储到对象object中,
参数key:通过key取出存储的value
参数policy:存储策略(assign,copy,retain)
* id objc_getAssociatedObject (id object, const void *key)
通过参数key将对象中存储的值取出来,
* Ivar *class_copyIvarList(Class cls, unsigned int *outCount )
获取某个类的所有成员变量(outCount表示成员变量总数的地址)
* const char *var_getName(Ivar v)
获取成员变量的名称
* const char *var_getTypeEncoding(Ivar v)
获取成员变量的类型
* void free (void *);
释放内存
在C函数中,如果函数名包含copy/create/retain/new等词,最终需要释放资源
2><objc/message.h>
* void objc_msgSend(void)
给某对象发送某个消息