runtime 总结(原创)

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.数据模型转换

posted on 2016-06-03 11:54  Jason_Luo  阅读(202)  评论(0编辑  收藏  举报

导航