iOS objc_getAssociatedObject && objc_setAssociatedObject的基本用法

一.AssociatedObject

1.大家在iOS的学习和实战过程中往往会遇到一些相对来说深奥一点的语法.而今天在这里将会给大家叙述关于 AssociatedObject的基本运用:objc_getAssociatedObject && objc_setAssociatedObject

2.说句实在话,我也是一个刚入行的小菜鸟,如果有写的不对的地方,请大家海涵和指点.(废话到此为止,直接上代码和注释)

二. 导入头文件

1. objc/runtime.h

下面是一个数组, 和一个字符串

NSArray *arr = [[NSArray alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
NSString *overView = [NSString stringWithFormat:@"%@,%@",@"five",@"six"];

调用方法1: 设置关联对象
objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)

  • 1.第一个参数: id object : 需要传入的是 : 对象的主分支
  • 2.第二个参数: const void *key : 是一个 static 类型的 关键字,这里根据开发者自身来定义就行(尽量写的有根据一点,避免以后忘记是干啥用的)
  • 3.第三个参数: id value : 传入的是: 对象的子分支
  • 4.第四个参数: objc_AssociationPolicy policy :是当前关联对象的类型 strong,weak,copy (枚举类型:开发者可以点进去看)

类的主分支:如果将一个label控件和控制器关联上,而且放在控制器上面,那么这个控制器对象 self 或者 self.view 就充当 主分支

子分支 : 那么这个label 就充当 子分支

③如果 控制器上有两个控件, 一个Label, 一个 View, 那么想这两个控件 弄上关联关系, 这两个控件随意一个做主分支,一个做子分支(这个根据开发场景而定)

2.如何确定主分支和子分支

如果子分支内存被释放了, 主分支没有释放, 那么可以通过 objc_getAssociatedObject获取到 子分支(虽然它被释放了,但是一样可以获取到) . 如果主分支被释放了,子分支没有释放, 则获取不到任何一个对象

调用方法2: 获取关联对象
objc_getAssociatedObject(<#id object#>, <#const void *key#>)就相对来说容易理解一点了

  • 1.第一个参数 : 主分支
  • 2.第二个参数 : 关键字

三.代码和注释

下面有讲到 解除关联对象, 以及 删除关联对象 objc_removeAssociatedObjects

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSArray *arr = [[NSArray alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];
    NSString *overView = [NSString stringWithFormat:@"%@,%@",@"five",@"six"];

    // 设置关联对象
    objc_setAssociatedObject(arr, &overViewKey, overView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    //  NSLog(@"%@==%@",arr,overView); // 正常打印结果 ,如果arr 没有被释放,就算overView被释放了, 也可以用到 overView.因为它们两关联起来了
    
    // 上面已经将 arr 和 overView 关联上了, 在这里 通过 objc_getAssociatedObject :arr , 和关键字 overViewKey ,将关联对象获取出来
    NSString *associatedObj = objc_getAssociatedObject(arr, &overViewKey);
    NSLog(@"associatedObj:%@",associatedObj); // 打印结果: associatedObj:five,six
    
    // 释放 关联对象
    // 第三个参数, 设为 nil, 则将 arr 与 nil 关联... 也等同于 : 没关联任何对象
    objc_setAssociatedObject(arr, &overView, nil, OBJC_ASSOCIATION_ASSIGN);
    
    // 移除 所有关联对象 : 这个方法 相当于 初始化 arr 对象一样(并不是初始化arr这个指针所指向的内存地址)
    objc_removeAssociatedObjects(arr);
}

四.看到别人代码块里头会用到 _cmd 这个关键字

此关键字代表的是什么?

- (UILabel *)textLabel{
    return objc_getAssociatedObject(self, _cmd);
}

上面代码 直接通过 objc_getAssociatedObject方法获取到 textLabel 关联的关键字, 或者 对象本身 或者 Bool 等等
而关键在于下面一个句代码:

- (void)setTextLabel:(UILabel *)textLabel{
    objc_setAssociatedObject(self, @selector(textLabel), textLabel, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

_cmd :第一句返回的时候,相当于返回一个 id对象 ,而关键字则是 : textLabel ,它是根据当前方法,直接使用方法的名称,即 - (***)textLabel 方法,并且能保证改名称不重复.(第一句代码方法名 : textLabel ,因为一个类中不可能用相同的方法名)

第二句代码中出现 @selector(textLabel),这里它就调用第一句代码了, @selector直接返回SEL,则获取到textLabel的方法名,则为第一句代码返回的值.

// 1.直接口述代码吧. 
// 2.上面两个方法 写在一个 单独的View中,在这个类的 .h中,创建一个 weak(若引用)的textLabel,而在.m文件中 initWithFrame中直接创建self.textLabel = [[UILabel alloc] initWithFrame:self.bounds];并添加到这个view上
// 3.那么按照常理来说, 这里应该报警告, 但是 在控制器中打印 这个类的 textLabel , 你会发现是有内存的, 如果把第一句和第二句代码注释掉, 打印则没有内存.

如果有什么疑问或者写的不对的地方,希望大家能帮忙指出来.谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容