您的位置:首页 > 其它

<objc/runtime.h>机制下的常用函数(一)

2018-01-15 14:49 197 查看
runtime:运行时,是一个c语言库。将我们编写的代码动态的转换成这个库中的函数,结构体,消息等,实现其他语言运行在object-C上。介绍几个函数。

1.objc_setAssociatedObject(id object,const void *key,id value,objc_AssociationPolicy policy)

id object:表示关联者。

const void *key:获取被关联者的key

id value:被关联者,对象。

policy:关联策略,有assign,retain,copy.一般使用”“OBJC_ASSOCIATION_RETAIN_NONATOMIC”

2."objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)",与上面函数一般成对出现

id object:关联者对象。

key:被关联对象索引key。

上面两个函数一般成对出现,一个绑定,一个获取绑定值。应用:在category中给对象添加属性:



3.“class_getInstanceMethod(Class_Nullable
cls,SEL_Nonnull
name)”和“class_getClassMethod(Class_Nullable
cls,SEL_Nonnull
name)”:获取当前类中的方法,前者是获取对象实例方法,后者获取对象类方法。

cls:被获取方法的实例化对象

SEL name:方法名的selector。

4.“method_exchangeImplementations(Method_Nonnull
m1, Method_Nonnull m2) ”被称为黑魔法(method
swizzling)

原理:发生在运行时,在运行时将两个method进行交换,我们可以将mehtod Swizzling的代码写在任何地方,但是只有当这段代码执行完成后才能起到交互的作用。所以一般我们使用load+Method Swizzling的方式进行方法的互换,因为load方法在APP运行时就会调用,且只调用一次。

应用地方:有人说,这有什么卵用,我既然知道这两个方法,我就可以在调用selector1方法的时候调用1,在需要selector2方法的时候调用2不就成了吗?对,确实是这样,但问题就出在这里,有些时候,苹果内部为了实现某个功能会自动的调用一系列函数,是我们不知道的。比如tableview的一系列代理方法,比如viewcontroller的一系列生命周期函数。还有一种情况,我们需要给某个系统的方法多添加一个功能,但我们不知道这个系统方法到底做了什么,如果我们重写了,就不能使用他原有的功能,这个时候Method
Swizzling就能完美解决。

例子:现在有这样的一个需求,我们需要在tableview reloadData的时候添加一个计数功能。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objcruntime oc 黑魔法