前两天一直在看JSPatch的实现原理,然后就发现一个objc_setAssociatedObject这个东西,这个东西呢主要是实现关联.该函数和objc_getAssociatedObject是配套是使用的,当然,既然可以关联,那么我们还可以移除关联objc_removeAssociatedObjects就是这个函数.
1.创建关联
创建关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。当然,此处的关键字和关联策略是需要进一步讨论的。
参数:1>源对象一般填写self(这里以写self我相信大家应该就懂源对象代表什么意思了)
2>关键字:关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。
3>关联的对象:填写我们想要关联的对象即可.
4>关联策略: 关联策略是一个枚举:
OBJC_ASSOCIATION_ASSIGN =0, 指定一个弱引用的关联对象
OBJC_ASSOCIATION_RETAIN_NONATOMIC =1,指定一个强引用相关联的对象 不自动
OBJC_ASSOCIATION_COPY_NONATOMIC =3,指定相关的对象被复制。不自动
OBJC_ASSOCIATION_RETAIN =01401,指定相关对象的强引用。自动
OBJC_ASSOCIATION_COPY =01403.指定相关的对象被复制。自动
至于,获得关联和移除关联,参数设置同上!
下面附上自己写的一个小demo,具体请参见笔者的github地址GitHub - 995996812/UIButtonBlock: UIButtonBlock!