博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
runtime 关联对象objc_setAssociatedObject
阅读量:6840 次
发布时间:2019-06-26

本文共 2985 字,大约阅读时间需要 9 分钟。

有许多人不知道runtime 黑魔法到底是干啥用的,到底有什么卵用,今天我们就来讲讲runtime - 关联对象objc_setAssociatedObject 的使用。

惯例美女大图一张,拿去撸!不客气!

使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。 有四个参数 1.被关联的对象 即源对象 2.要关联的对象的键值,一般设置成静态的,用于获取关联对象的值(就是给你要添加的东西起个名字而已) 3.关联的对象 4.关联时采用的协议,有assign,retain,copy等协议 点击进去选取枚举

objc_setAssociatedObject(self, &associatedButtonkey, blcok, OBJC_ASSOCIATION_COPY_NONATOMIC); //通过 objc_getAssociatedObject获取关联对象 objc_getAssociatedObject(self, &associatedButtonkey);     //使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。

断开关联是使用objc_setAssociatedObject函数,传入nil值即可。     objc_setAssociatedObject(self, &associatedButtonkey, nil, OBJC_ASSOCIATION_COPY_NONATOMIC);

#####下面我们就用这个鬼东西给UIButton绑定一个Block

先创建一个UIButton的category 然后声明一个block属性 确切的说不是属性,其实是生成了两个方法getter 和 setter

static const char associatedButtonkey;typedef void (^btnBlock)(id sender);@property (nonatomic, copy) btnBlock blcok;复制代码

声明一个方法 + (instancetype)WB_fatoryButtonWithFrame:(CGRect)frame                                WithTitle:(NSString *)title                           WithTitleColor:(UInt32)titleHexColor                                 Withfont:(CGFloat)font                                Withimage:(id)image                             WithselImage:(id)selImage                              toSuperView:(UIView *)superView                                WithClick:(btnBlock)block;

+ (instancetype)WB_fatoryButtonWithFrame:(CGRect)frame复制代码

WithTitle:(NSString *)title                           WithTitleColor:(UInt32)titleHexColor                                  Withfont:(CGFloat)font                                 Withimage:(id)image                             WithselImage:(id)selImage                              toSuperView:(UIView *)superView                                WithClick:(btnBlock)block{     UIButton *btn = [[UIButton alloc] initWithFrame:frame];     [superView addSubview:btn];          btn.titleLabel.font = [UIFont systemFontOfSize:font];     [btn setTitleColor:[UIColor colorWithRGBHex:titleHexColor alpha:1] forState:UIControlStateNormal];     if (!kIsEmptyString(title)) {         [btn setTitle:title forState:UIControlStateNormal];     }          UIImage *normalImage = nil;     if ([image isKindOfClass:[NSString class]]) {         normalImage = kImage(image);     } else if ([image isKindOfClass:[UIImage class]]) {         normalImage = image;     }          UIImage *selectedImage = nil;     if ([selImage isKindOfClass:[NSString class]]) {         selectedImage = kImage(selImage);     } else if ([selImage isKindOfClass:[UIImage class]]) {         selectedImage = selImage;     }          if (normalImage) {         [btn setImage:normalImage forState:UIControlStateNormal];     }          if (selectedImage) {         [btn setImage:selectedImage forState:UIControlStateSelected];     }

if (block)     { //这里调用setter         btn.blcok = block;     }          return btn; }

- (void)btnAction:(id)sender{// 这里调用getter复制代码

self.blcok(sender); }

// setter- (void)setBlcok:(btnBlock)blcok{// 给UIButton 关联一个block复制代码

objc_setAssociatedObject(self, &associatedButtonkey, blcok, OBJC_ASSOCIATION_COPY_NONATOMIC);     [self removeTarget:self                 action:@selector(btnAction:)       forControlEvents:UIControlEventTouchUpInside];          if (blcok) {         [self addTarget:self                  action:@selector(btnAction:)        forControlEvents:UIControlEventTouchUpInside];     } } //getter - (btnBlock)blcok{ // 之前说过的给起个名字,通过那个名字获取添加的 block     return objc_getAssociatedObject(self, &associatedButtonkey); }

最后提醒小伙伴们不要忘记了import #import <objc/objc-runtime.h>

转载地址:http://zrkul.baihongyu.com/

你可能感兴趣的文章
TDD容易被忽略的五大前提
查看>>
持续交付:巨大的益处也伴随着巨大的挑战
查看>>
《NoSQL For Mere Mortals》书评与作者问答录
查看>>
从竞价词拍卖到人工智能 看阿里妈妈搜索营销之路
查看>>
使用weinre 远程调试移动设备上的网页
查看>>
Microsoft 宣布推出Nano Server与Hyper-V容器
查看>>
Racket 6.11提供了稳定的细化类型和依赖函数特性
查看>>
Linux常用命令: find 和 ping
查看>>
ajax分页
查看>>
一个8年web前端从业者的迷茫
查看>>
Nginx出现could not build the server_names_hash 解决办法
查看>>
angular入门
查看>>
Hexo搭建博客
查看>>
有哪些 JS 调试技巧——devtool,以及安装问题的解决
查看>>
FastReport.Net v2016.6发布
查看>>
NDK开发 - JNI开发流程
查看>>
理解引用
查看>>
[LintCode/LeetCode] Merge Two Sorted Lists
查看>>
CSS进阶篇--div中的内容垂直居中的五种方法
查看>>
Apache Tomcat 7.0.93 发布,开源 Java Web 应用服务器
查看>>