runtime实际运用场景
1.使用runtime可以读取iOS系统类有哪些私有属性,并通过kvc或者函数修改或者读取其值。
Ivar *class_copyIvarList(Class cls, unsigned int *outCount) 读取某个类所有属性和成员变量
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount) 读取某个类所有属性
const char *ivar_getName(Ivar v) 返回属性或成员变量的名字 同理 property_getName
ivar_getTypeEncoding 获取类型
object_setIvar 修改属性值
2.在运行时动态添加新的函数、修改私有函数、交换其中两个私有函数的实现、替换私有函数.
IMP class_replaceMethod(Class cls, SEL name, IMP imp,
const char *types) 替换函数或方法
void class_replaceProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount) 替换属性
SEL
这个是方法名称的描述。
IMP
这个是具体的方法的地址。
NSObject 类中的methodForSelector:方法就是这样一个获取指向方法实现IMP 的指针,methodForSelector:返回的指针和赋值的变量类型必须完全一致,包括方法的参数类型和返回值类型。 // SEL --> IMP
3.动态挂载对象
如果你在对象传递(传参)的时候需要用到某个属性,按照以往的思路:我继承这个类重新一个新类就完事了,OK,这个思路没有问题,但是你不觉得要新建一个.h和一个.m文件有点麻烦?程序员都是懒惰的,要是有一个方法能直接讲我想要的属性挂载上前去岂不是更好?代码简单、易懂。看了标题你就应该知道Runtime能帮你实现你的愿望。
常用于UIAlertView ,或者给分类添加属性。
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
id objc_getAssociatedObject(id object, const void *key)
isa 指针是当你向对象发送消息时,Objective-C Runtime 检查一个对象并且查看它的类是什么然后开始查看它是否响应这些 selectors 所需要的一切。
4.数据模型转换