在一篇简书中看到作者使用了objc_setAssociatedObject来为button添加响应block ,所以摘出来研究一下。
首先介绍一下objc_setAssociatedObject这个方法,
这个方法是Objective-C的运行时函数,用来把一个对象与另一个对象进行关联。
既然说了它是运行时函数,用到它的地方就要:
//#import <objc/runtime.h>头文件 这个不用解释了吧.
objc_setAssociatedObject一共需要四个参数,分别是源对象,关键字,关联的对象和一个关联策略
解释一下
源对象和关联对象就是需要进行关联的两个对象,而 关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字;关联策略呢,是个枚举,用来表示两个对象的关联程度,具体效果大家自己可以实验一下。
而objc_getAssociatedObject是和objc_setAssociatedObject配套使用的,它是获取相关联的对象时使用的,
objc_getAssociatedObject两个参数源对象于关键字,注意关键字唯一且一致。
就拿上面那个兄弟的button举个例子: 分别是.h与.m以及使用
屏幕快照 2016-06-16 下午4.41.21.png 屏幕快照 2016-06-16 下午4.41.11.png 屏幕快照 2016-06-16 下午4.42.52.png
这样大家就可以很好的理解和使用了,下面是提供代码兄弟的简书地址,大家有兴趣研究的,可以去看一下哦,谢谢大家的支持!
网友评论
{
return [objc_getAssociatedObject(self, _cmd) floatValue];
}
-(void)setGifDuration:(CGFloat)gifDuration
{
objc_setAssociatedObject(self, @selector(gifDuration), @(gifDuration), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
这个代码里面 @selector(gifDuration) 和 _cmd 是也一样的为什么写成不一样呢?