objc_setAssociatedObject(<#id _Nonnull object#>, <#const void * _Nonnull key#>, <#id _Nullable value#>, <#objc_AssociationPolicy policy#>)
这四个后面的参数分别表示:源对象,关键字,关联的对象和一个关联策略。
关联策略是一个枚举
OBJC_ASSOCIATION_ASSIGN = 0, <指定一个弱引用关联的对象>
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,<指定一个强引用关联的对象>
OBJC_ASSOCIATION_COPY_NONATOMIC = 3, <指定相关的对象复制>
OBJC_ASSOCIATION_RETAIN = 01401, <指定强参考>
OBJC_ASSOCIATION_COPY = 01403 <指定相关的对象复制>
objc_getAssociatedObject(<#id _Nonnull object#>, <#const void * _Nonnull key#>)
第一个参数为源对象,第二个参数为关键字,这个方法为用来获取关联对象。
移除关联的时候调用objc_setAssociatedObject关联对象设置为nil就可以。
- (void (^)(TouchBlock))touchUpInside{
return ^(TouchBlock block){
//将self和block关联起来
objc_setAssociatedObject(self, touchKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
[self addTarget:self action:@selector(touchUpInside) forControlEvents: UIControlEventTouchUpInside];
return ;
};
}
- (void)touchUpInSide:(UIButton *)button{
//根据关联获取block
TouchBlock block = objc_getAssociatedObject(self, touchKey);
if (block) {
block();
}
}