objc_setAssociatedObject和objc_getAssociatedObject

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();
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容