<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的时候添加一个计数功能。
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的时候添加一个计数功能。
相关文章推荐
- <objc/runtime.h>中Associative机制(在button以及block传值)
- <iOS>Objective-C常用的函数和常用的常量
- <objc/runtime.h>中Associative机制(在button以及block传值)
- error LNK2019: 无法解析的外部符号 ___glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用 1>GEARS.obj : e
- web.config中的<httpRuntime> 元素
- <Python高级全栈开发工程师-1>学习过程笔记【181-184】正则表达式 <特殊字符><函数>
- Python脚本控制的WebDriver 常用操作 <十> 层级定位
- <转>高效的输入函数 --- 适用于ACM竞赛里输入数据特别多的情况
- Qt中如何使用<unistd.h>中的函数
- #include <algorithm> 常用函数
- <C++略识>之多态和虚函数
- linux网络编程常用函数详解与实例(socket-->bind-->listen-->accept)
- Oracle 基础 <2> --函数
- #include <algorithm> 常用函数
- <JavaSE学习笔记>面向对象(2):Java内存机制
- <C++略识>之函数重载
- <深入理解JavaScript>学习笔记(4)_立即调用的函数表达式
- < 转>Java 反射机制浅析
- 队列<queue>中的常用函数
- C++库常用函数一览(<string><cctype><algorithm><cmath><cstdlib><iomanip><numeric>)