objective-c 中的关联介绍

转载请注明CSDN博客上的出处:
http://blog.csdn.net/daiyibo123/article/details/46471993


如何设置关联

我们可以使用下面的方法来关联属性:

objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
  1. 被关联的对象,下面举的例子中关联到了UIAlertView
  2. 要关联的对象的键值,一般设置成静态的,用于获取关联对象的值
  3. 要关联的对象的值,从接口中可以看到接收的id类型,所以能关联任何对象
  4. 关联时采用的协议,有assign,retain,copy等协议,具体可以参考官方文档

可以通过下面的方法来获取我们刚刚关联的object:

objc_getAssociatedObject(id object, const void *key);
  1. 被关联的对象
  2. 要关联的对象的键值,一般设置成静态的,用于获取关联对象的值

简单运用

下面是简单地viewController类,黏贴直接可以运行:

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController@end
#import "ViewController.h"
#import <objc/runtime.h>static char kUITableViewIndexKey;@interface ViewController ()
@end@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];UILabel *lable = [[UILabel alloc] initWithFrame:CGRectMake(0, 200, [UIScreen mainScreen].bounds.size.width, 50)];lable.backgroundColor = [UIColor lightGrayColor];lable.text = @"关联属性";lable.textColor = [UIColor blackColor];objc_setAssociatedObject(self, &kUITableViewIndexKey, lable, OBJC_ASSOCIATION_RETAIN_NONATOMIC);//设置一个关联[self.view addSubview:objc_getAssociatedObject(self, &kUITableViewIndexKey)];//获取刚刚关联的lable
}
@end

注:在获取和设置关联的时候,调用的被关联对象(代码中用的是self)和关联键值(代码中用kUITableViewIndexKey)都必须是同一个对象。这样才可以保证能获取到关联对象。


个人理解

下面是键值的较好的运用:

代码介绍:一个仿系统的TabBarController类(RDVTabBarController,这个是第三方库,下载地址:https://github.com/robbdimitrov/RDVTabBarController)

在创建RDVTabBarController时,建立了两个UIViewController的扩展,扩展中建立关联,关联代码如下:

@interface UIViewController (RDVTabBarControllerItemInternal)- (void)rdv_setTabBarController:(RDVTabBarController *)tabBarController;@end@interface UIViewController (RDVTabBarControllerItem)@property(nonatomic, readonly) RDVTabBarController *rdv_tabBarController;@end
@implementation UIViewController (RDVTabBarControllerItemInternal)- (void)rdv_setTabBarController:(RDVTabBarController *)tabBarController {objc_setAssociatedObject(self, @selector(rdv_tabBarController), tabBarController, OBJC_ASSOCIATION_ASSIGN);
}
@end@implementation UIViewController
(RDVTabBarControllerItem)- (RDVTabBarController *)rdv_tabBarController{RDVTabBarController *tabBarController = objc_getAssociatedObject(self, @selector(rdv_tabBarController));//这里使用的递归算法if (!tabBarController && self.parentViewController) {tabBarController = [self.parentViewController rdv_tabBarController];}return tabBarController;
}
@end

然后在RDVTabBarController创建中调用ViewController的扩展方法rdv_setTabBarController:(因为RDVTabBarController也是ViewController的子类,所以可以调用)。通过这个方法设置关联,将TabBarViewController中的childView都和TabBarViewController关联起来。

下面是RDVTabBarController中调用扩展方法设置关联的代码:
(这个简化了其他与关联无关的代码,需要了解其他的,自己从github上下载这个第三方库看源码。)

- (void)setViewControllers:(NSArray *)viewControllers {        if (viewControllers && [viewControllers isKindOfClass:[NSArray class]]) {//向TabBarViewController中添加关联for (UIViewController *viewController in viewControllers) {[viewController rdv_setTabBarController:self];}} else {//没有向TabBarViewController中添加viewController,删除关联,删除TabBarViewCOntroller中的childViewControllerfor (UIViewController *viewController in _viewControllers) {[viewController rdv_setTabBarController:nil];}_viewControllers = nil;}
}

完成了上面的设置之后,我们就在项目中,直接通过当前运行的viewController来获取tabBarViewController这个属性了。

下面是示范代码:

[self.rdv_tabBarController setTabBarHidden:!_viewController.rdv_tabBarController.tabBarHidden animated:YES];//通过点运算符,调用UIViewController中的扩展方法:`rdv_tabBarController`。然后在`rdv_tabBarController`扩展方法中,递归寻找和RDVTabBarViewController关联的属性。

运行结果简介:

简单运行一个demo,po打出相关RDVTabBarController中相关信息:

  • 放入TabBarController中的四个NavigationViewController

  • 第一个NavigationViewController,push推入下一个viewController;推入之后,运行上面的“直接通过当前运行的viewController来获取tabBarViewController”中的代码:

在这里递归寻找关联值,第一个ViewController地址为:’0x7f9378e750a0‘没有进行关联,找不到。然后跳到父视图中,地址为:‘0x7f9378d39a70’有相关,找到,不需要在向下寻找。递归结束,找到关联值,返回结果。

小结:

这里,通过扩展和关联的结合使用,将RDVTabBarController这个实例属性,和当前的ViewController结合起来。这种思想,在以后自己编写第三方库函数的时候,值得借鉴!
总体来说,associative的主要原理,就是把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。


参考:

http://m.blog.csdn.net/blog/csz0102/19555673

转载于:https://www.cnblogs.com/AbeDay/p/5026907.html

objective-c 中的关联介绍相关推荐

  1. PHP中遍历关联数组的方法

    下面介绍PHP中遍历关联数组的三种方法: foreach <?php $sports = array( 'football' => 'good', 'swimming' => 've ...

  2. 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

     1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> < ...

  3. C++ STL : 模拟实现STL中的关联式容器unordered_map/unordered_set

    目录 unordered_map/unordered_set unordered_map/unordered_set与map/set的区别 底层哈希桶的改造 仿函数 Key值的获取方法 hash(ke ...

  4. 《编程珠玑(续)(修订版)》—第2章2.1节Awk中的关联数组

    本节书摘来自异步社区<编程珠玑(续)(修订版)>一书中的第2章,第2.1节Awk中的关联数组,作者[美]Jon Bentley,更多章节内容可以访问云栖社区"异步社区" ...

  5. Window系统中Hosts文件介绍

    Window系统中Hosts文件介绍 hosts文件用于将常用的网址域名与其对应的IP地址建立关联,相当于本地的一个dns服务,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件 ...

  6. 6、MySQL 中索引的介绍

    6.MySQL 中索引的介绍 6.1.索引是什么? MySQL 官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构. 索引的本质:索引是数据结构.你可以简单理解为&quo ...

  7. “该文件没有与之关联的程序来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置”页面中创建关联。

    Win10,鼠标右击,点击"显示设置"."个性化",弹出"该文件没有与之关联的程序来执行该操作.请安装应用,若已经安装应用,请在"默认应用设 ...

  8. HTML中Css详细介绍

    HTML中Css详细介绍 一.样式表的作用 1.Css样式表,层叠样式表 2.类似于人类的衣服,网页的衣服 3.作用:美化网页 4.优势: 1.内容与表现分离,便于维护 2.样式丰富,页面布局灵活 3 ...

  9. Linux下使用ls查看文件颜色全部为白色的解决方法,以及Linux中文件颜色介绍

    1 解决ls查看文件爱呢颜色为白色 方法一: 1.修改~/.bashrc文件,添加如下内容 alias ls='ls --color=auto' 2.source一下,让修改配置生效 source ~ ...

  10. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

最新文章

  1. 理解 UDDI(统一描述、发现和集成)
  2. thinkPHP学习笔记(2)
  3. 如何在10亿个整数中找出前1000个最大的数(TopN算法)
  4. kali下sqliv:SQL注入URL扫描器
  5. Jmeter===Jmeter中使用CSV Data Set Config参数化不重复数据执行N遍(转)
  6. 【leetcode】Combinations (middle)
  7. Top-down与Bottom-up
  8. 发卡网源码 去后门 可以扩展码支付
  9. 1.2 Hadoop快速入门
  10. 优科豪马冬季SUV轮胎G072的性能特点全解
  11. linux ps命令是什么,linux中的ps命令的详细解释
  12. 键盘怎么按出计算机,怎么在电脑键盘上打出艾特@键? 原来是这样的
  13. 汇编指令CALL的硬编码E8 和 JMP 的硬编码E9 后面参数的计算方法
  14. 怎样成为公司喜欢的人?小技巧
  15. 从IO谈论编程的基础
  16. ES安装的详细步骤、ES的集群搭建以及ElasticSearch安装时可能出现的问题
  17. matlab生成随机矩阵
  18. python和c 情侣网名_可爱超萌的情侣网名 超可爱的情侣网名
  19. PHP读取Excel文件(PHPExcel)
  20. 学计算机要什么基础,什么人适合学计算机

热门文章

  1. 解决Mysql安装之后没有my.ini配置文件问题
  2. SQL Server数据库查询sql去掉小数后点后末尾的0
  3. 静态代码块、构造代码块以及构造函数的加载顺序
  4. Thinking in Java 11.3 添加一组元素
  5. IE 8 HTML Parsing Error:Unable to modify the parent container element before the child element is...
  6. Java日期练习—计算已出生多少天
  7. linux设置r镜像,一劳永逸,R的个性化默认配置
  8. 整体压缩跟分开压缩哪个更小_目标检测轻量化压缩
  9. python怎么爬取一个网页图片_python3爬取网页图片
  10. vb6 由于超出容量限制 不能创建新事务_Executors类创建四种常见线程池