[iOS] objc_setAssociatedObject objc_getAssociatedObject 简单明了的一个理解
关联
关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的。
在类的定义之外为类增加额外的存储空间
使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。
关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可。关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。
创建关联
创建关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。当然,此处的关键字和关联策略是需要进一步讨论的。
■ 关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。
■ 关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。这种关联策略是通过使用预先定义好的常量来表示的。
下面的代码展示了如何把一个字符串关联到一个数组上。
- #import <Foundation/Foundation.h>
- #import <objc/runtime.h>
- int main(int argc, const char* argv[])
- {
- NSAutoreleasePool * pool = [[NSAutoreleasePool] alloc init];
- static char overviewKey;
- NSArray *array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];
- //为了演示的目的,这里使用initWithFormat:来确保字符串可以被销毁
- NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"];
- objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
- [overview release];
- NSString *associatedObject = (NSString *)objc_getAssociatedObject(arrray, &overviewKey);
- NSLog(@"associatedObject:%@", associatedObject);
- objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
- [array release];
- [pool drain];
- return 0;
- }
[iOS] objc_setAssociatedObject objc_getAssociatedObject 简单明了的一个理解相关推荐
- java实现线性回归(简单明了,适合理解)
今天做了一个小demo测试一下线性回归直线拟合. package htt.wave.notification.qztest;/*** @authorseerhuitao 线性回归编程* @create ...
- pattern java怎么用_Pattern Java设计模式23种每个一个举例使用,名称直接对应英文,简单明了 Develop 238万源代码下载- www.pudn.com...
文件名称: Pattern下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 156 KB 上传时间: 2014-05-17 下载次数: 2 提 供 者: 王小雄 详 ...
- 【iOS沉思录】如何招聘一个靠谱的 iOS程序员+面试题详解
说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均为简答题. 出题者简介: 孙源(sunnyxx),目前就 ...
- sql 执行顺序_10个简单步骤,完全理解SQL
点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 多年前收藏在笔记中的一篇文章,今天偶然翻出,重读了一遍,依然大有收获.分享出来,大家一 ...
- 为什么使用@tablename起别名产生的sql语句不能用_10个简单步骤,完全理解SQL
多年前收藏在笔记中的一篇文章,今天偶然翻出,重读了一遍,依然大有收获.分享出来,大家一起探讨. 以本文是为了以下读者而特地编写的: 1. 在工作中会用到 SQL 但是对它并不完全了解的人. 2. 能够 ...
- 简单明了的正则表达式汇总
简单明了的正则表达式汇总!!! 资源来源:编程胶囊官网 基础正则总结 实例 描述 [Pp]ython 匹配"Python"或"python". rub[ye] ...
- 1、OPenGL ES - 简介、iOS中GLKit简单应用
OPenGL ES - 简介.iOS中GLKit简单应用 一.OPenGL ES 1.简介: OpenGL ES 是以手持和嵌入式为目标的高级的3D图形应用程序编程接口(API),OpenGL ES ...
- 5G知识科普, 讲的这么简单明了
转载自:第一次有人把 5G 讲的这么简单明了 一个简单且神奇的公式 今天的故事,从一个公式开始讲起.这是一个既简单又神奇的公式.说它简单,是因为它一共只有 3 个字母.而说它神奇,是因为这个公式 ...
- 也许开发需要的只是一份简单明了的表格
本人原先是一名移动端开发工程师,本来是要一条道走到黑,准备做个it大咖,结果事与愿违,走到了测试的道路上.今天介绍一件通信测试上发生的事. 公司为青海移动做个项目,处于系统测试阶段,对各个系统进行测试 ...
最新文章
- 100内奇数之和流程图_IATF 16949体系资料之过程流程图,收藏备用!
- pandas将dataframe中的特定数据列的内容转化为列表list数据(convert dataframe column values into a list)
- JavaScript 开发者最期待的年度大会,惊喜不断,错过还要等好久!
- CentOS上使用OpenStack的一些问题
- AS3工程中的Loading的应用
- 苹果4如何添加时间插件_苹果手机如何添加九键或26键输入法?iPhone怎样快速切换输入法?...
- Plsql运行mysql脚本_oracle中PLSQL语句
- java 方法执行结束局部变量释放_Java方法执行的内存模型
- halcon图片上传到mysql_C# 10个线程并发执行Halcon图像算法 报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”...
- 重庆邮电大学计算机科学与技术培养方案,重庆邮电大学计算机科学与技术学院.doc...
- 潜在语义分析(Latent Semantic Analysis,LSA)
- MVC SignalR Hub实时聊天实时Web解决方案
- ext2删除文件恢复笔记
- GNOME 2.18.2
- python结束线程类_Python线程指南(转)
- python对象销毁(垃圾回收)
- 合数阶群与素数阶群的双线性映射
- 面部捕捉技术_一种基于面部捕捉系统的捕捉点定位系统的制作方法
- android云新消息接收者全局,消息推送之百度云推送Android集成与用法(示例代码)...
- window gcc编译器备忘录[Makefile语法说明][make clean指令错误(process_begin: CreateProcess()failed.]
热门文章
- 利用python进行数据分析数据集_《利用Python进行数据分析》终章·数据分析案例·学习笔记(二)...
- 6.电报机与继电器qk
- 苏州大学计算机学院江苏如皋人,秦岭深处的火热青春——记苏州大学如皋籍学生佘一奇的支教故事...
- Java中文分词组件 - word分词(skycto JEEditor)
- html5中字体显示不出来怎么办,手机字体无法正常显示怎么办
- 等级保护与解读《网络安全法》
- 多生成树协议(MSTP)
- 《会计学》账户与复式记账笔记的思维导图
- 大国重器“兵器谱”,了解一下
- 用python编程、假设一年期定期利率_第二章-习题答案