- 可以遍历对象的属性
- 可以动态的添加、修改属性,动态添加、修改、替换方法,动态添加、修改、替换协议
- 可以动态创建类、对象、协议
- 可以拦截方法
/**
利用runtime 可以实现一些OC 不容易实现的功能
- 动态交换两个的实现(特别是交换系统自带的方法)
- 动态添加成员变量和成员方法
- 获得某个类的所有方法,所有变量
*/
OC: [obj func];
runtime: objc_msgSend(obj, @selector(func));
// 获取属性
id personClass = objc_getClass("CZPerson");
unsigned int outCount;
objc_property_t *propertys = class_copyPropertyList(personClass, &outCount);
for (int i = 0; i < outCount; i++) {
objc_property_t property = propertys[i];
printf("%s:%s\n", property_getName(property), property_getAttributes(property));
}
free(propertys);
/// 使用: 可以在分类中实现方法,替换原生方法,实现自己的想要的东西
// 获取某个类的方法
// class_getClassMethod(__unsafe_unretained Class cls, SEL name)
// 获取某个实例对象方法
// class_getInstanceMethod(__unsafe_unretained Class cls, SEL name)
// 交换两个方法
// method_exchangeImplementations(Method m1, Method m2)
/// 使用: 在分类中使用getter setter 方法
// setter 将某个值跟某个对象关联起来,将某个值存到对象中去
// objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
// getter
// objc_getAssociatedObject(self, nameKey);
/// 使用: 获取类中的所有方法和变量
// class_copyIvarList(__unsafe_unretained Class cls, unsigned int *outCount)
// 获取成员变量的名字
// ivar_getName(Ivar v);
// 获取成员变量的类型
// ivar_getTypeEncoding(Ivar v)