有许多人不知道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>

runtime 关联对象objc_setAssociatedObject相关推荐

  1. 【iOS开发】——Category底层原理、Extension、关联对象

    [iOS开发]--Category底层原理.Extension.关联对象 Category是什么?它可以用来干什么? Category特点 Category的实质以及实现过程 Category结构体 ...

  2. iOS Category 添加属性实现原理 - 关联对象

    iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系.对象一开始初始化的时候其属性 ...

  3. 通过Runtime源码了解关联对象的实现

    原文链接 在iOS开发中,Category是经常使用到的一个特性,合理的使用Category能够减少繁琐代码,提高开发效率.在使用Category时,有经验的开发者应该都知道,在Category中是无 ...

  4. iOS runtime实战应用:关联对象

    在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime 有筒子在面试的时候,遇到这样一个问题:"如何給NSArray添加一个属性(不能使用继承)",筒 ...

  5. iOS Runtime特性之关联对象

    前言 现在你准备用一个系统的类或者是你写的类,但是这个类并不能满足你的需求,你需要额外添加一个属性. 一般解决办法要么是extends(继承),要么使用category(类别). 而我并不推荐使用ex ...

  6. oc 协议 回调 静态成员_OC底层原理探究:Category、关联对象和block本质

    1.分类Category的使用 // 给MJPerson类添加分类 @interface MJPerson : NSObject - (void)run; @end@implementation MJ ...

  7. runtime的常用方法objc_setAssociatedObject的使用

    为什么80%的码农都做不了架构师?>>>    -(void)click:(UIButton *)sender {NSString *message = @"你是谁&quo ...

  8. ios 中的关联对象

    2019独角兽企业重金招聘Python工程师标准>>> 关联对象的简单使用: #import "wangmumu.h" @interface wangmumu ( ...

  9. iOS开发之Runtime关联属性

    2019独角兽企业重金招聘Python工程师标准>>> 首先,推荐给大家一个非常好用的一个网站: 非盈利无广告开发者专用网址导航:http://www.dev666.com/ API ...

最新文章

  1. vim关闭下一行也是注释_10分钟教你为自己打造一个专属VIM
  2. python3代码转python2_Python2代码转成Python3代码
  3. DateTime格式大全
  4. 数据oem 操作手册_海口电销外呼系统oem-河南爱聊科技
  5. python语句解释_深入理解python with 语句
  6. 【nuxtjs 指南】解决nuxtjs本地开发跨域和防止路由与api冲突问题
  7. Linux命令之 mount -- 文件系统挂载
  8. Instant类的使用
  9. 倒序查10条数据_餐饮业总营收增量七成由外卖拉动,天眼查数据显示今年我国新增相关企业超10万家...
  10. java终端线程_java多线程-中断线程
  11. mysql基础数据类型字节数_MySQL基础之数据类型
  12. bugly android8.1加固,2020-09-27 Bugly Android热更新使用指南
  13. python中的real是什么意思_为什么“1.real”语法错误,但“1 .real”在Python中有效?...
  14. 浅谈RSTP的快速收敛机制 P/A机制
  15. 基于Python的贪吃蛇游戏设计
  16. BackgroundWorker线程控件用法
  17. linux查询电信端口,linux下获取电信,网通,铁通IP地址
  18. 显示器 设置选项 解析
  19. 浅谈安科瑞餐饮油烟在线监测系统在餐饮油烟治理中起到的作用
  20. 这个开源好用的数据库建模工具,让我眼前一亮

热门文章

  1. SSM实现学生宿舍管理系统
  2. Cannot identify version of git executable: no response
  3. 2018-2019-2 网络对抗技术 20165301 Exp3 免杀原理与实践
  4. HTML5手机页面里面如何把长按复制避免
  5. 《Java基础入门》课后习题答案 资源分享
  6. 16.刚体碰撞事件监测与处理
  7. 程序员们的时间管理法则
  8. .NET 开发环境中使用VSN版本控制
  9. 算子find_shpe_model参数详解
  10. c#_textbox显示刷新规定行数的数据