一、相关函数

与Associated Objects相关的函数有三个

1 void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);

2 id objc_getAssociatedObject(id object, const void *key);

3 void objc_removeAssociatedObjects(id object);

其中常用的函数是前两个,第三个不经常用。

简单来说,objc_setAssociatedObject用于关联对象,objc_getAssociatedObject用来获取关联的对象,objc_removeAssociatedObjects用来移除关联的对象。

二、object、key、value、policy

object:你所关联的对象。

key:所用的key值(就像key有钥匙的含义,通过key,你就可以找到这个对象关联的值)

value:所关联的值。

policy:关联策略(其实就是那几个引用)。

 三、key

1.声明 static char overviewKey;,使用&overviewKey作为key值;

2.声明 static void *overviewKey = &overviewKey;,使用overviewKey作为key值;

3.用selevtor,使用getter方法的名称作为key值。

需要说明的是,key不需要赋值,只需声明。

四、关联策略

给对象添加关联对象时有五种关联策略可供选择:

关联策略 等价属性   说明
OBJC_ASSOCIATION_ASSIGN

@property (assign)

or@property (unsafe_unretained)

弱引用关联对象
OBJC_ASSOCIATION_RETAIN_NONATOMIC @property (strong, nonatomic) 强引用关联对象,且为非原子操作
OBJC_ASSOCIATION_COPY_NONATOMIC @property (copy, nonatomic) 复制关联对象,且为非原子操作
OBJC_ASSOCIATION_RETAIN @property (strong, atomic) 强引用关联对象,且为原子操作
OBJC_ASSOCIATION_COPY @property (copy, atomic) 复制关联对象,且为原子操作

五.简单的代码

static char stringKey;

NSArray *array = [[NSArray alloc]initWithObjects:@"One",@"Two",@"Three", nil];

NSString * string = @"这是一个测试";

objc_setAssociatedObject(array, &stringKey, string, OBJC_ASSOCIATION_RETAIN);//在这里将string与array关联

NSString *associatedObject = (NSString *)objc_getAssociatedObject(array, &stringKey);//这里将string的值赋给associatedObject

参考链接

http://blog.leichunfeng.com/blog/2015/06/26/objective-c-associated-objects-implementation-principle/

http://blog.csdn.net/quanqinyang/article/details/38017581

欢迎有错进行纠正,一起进步。

关于Objective-C Associated Objects的更多相关文章

  1. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  2. Object Pascal中文手册 经典教程

    Object Pascal 参考手册 (Ver 0.1)ezdelphi@hotmail.com OverviewOverview(概述)Using object pascal(使用 object p ...

  3. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  4. C++ vs Objective C

    oc Short list of some of the major differences: C++ allows multiple inheritance, Objective-C doesn't ...

  5. represent states with objects

    1. The behavior of objects in the real world is more complex than simply being in one state at a tim ...

  6. #学习笔记# VALSE 2019.01.09 朱俊彦 --- Learning to Synthesize Images, Videos, and 3D Objects

    视频类型:VALSE-webinar 报告时间:2019年01月09日 报告人:MIT朱俊彦 报告题目:Learning to Synthesize Images, Videos, and 3D Ob ...

  7. Objective -C Categories

    Objective -C Categories  The dynamic runtime dispatch mechanism employed by Objective-C lets you add ...

  8. Objective -C Object initialization 对象初始化

    Objective -C Object initialization 对象初始化 1.1 Allocating Objects  分配对象 Allocation is the process by w ...

  9. Objective -C Memory Management 内存管理 第一部分

    Objective -C Memory Management  内存管理  第一部分 Memory management is part of a more general problem in pr ...

  10. Objective - c Foundation 框架详解2

    Objective - c  Foundation 框架详解2 Collection Agency Cocoa provides a number of collection classes such ...

随机推荐

  1. noip推荐系列:汽艇[贪心]

    [问题背景] 一天sxc,zsx,wl到gly坐汽艇,本来和其他的人约好了一起去,结果被放了鸽子,3人便只有一人负担x元去坐汽艇(很贵哦).坐了才发现如果汽艇上人多了位置就不宽敞,就不好玩了.而3个人 ...

  2. Java学习笔记——JDBC之PreparedStatement类中“预编译”的综合应用

    预编译 SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用此对象多次高效地执行该语句. 预编译的优点 1.PreparedStatement是预编译的,对于批量处理 ...

  3. vim插件:显示树形目录插件NERDTree安装 和 使用

    下载和配置 NERDTree插件的官方地址如下,可以从这里获取最新的版本 https://github.com/scrooloose/nerdtree 下载zip安装包 或者使用下面官网源文件安装方法 ...

  4. Cocos2d学习之路五(Box2d使用CCPhysicsSprite时编译不通过解决方法)

    cocos2d使用box2d引擎,在使用CCPhysicsSprite添加精灵的时候会出现编译不通过错误. 需要注意以下几点: 1.sprite.position=ccp(p.x,p.y);这行代码一 ...

  5. C#实战Microsoft Messaging Queue(MSMQ)

    C#实战Microsoft Messaging Queue(MSMQ)消息队列(干货) 前言 在使用MSMQ之前,我们需要自行安装消息队列组件!(具体安装方法大家自己搜一下吧) 采用MSMQ带来的好处 ...

  6. TCP可靠传输的实现

    TCP可靠传输的实现 1.概述      为方便描述可靠传输原理,假定数据传输只在一个方向上进行,即A发送数据,B给出确认 2.以字节为单位的滑动窗口      TCP的滑动窗口是以字节为单位的.为了 ...

  7. JavaEE:Eclipse开发工具的相关使用和XML技术

    Eclipse开发工具的知识点1.工程的属性(properties)1)Text file encoding  工程编码(在导入其他工程时,注意编码类型一致)2)Java build path设置cl ...

  8. 一步一步深入spring(2)-三种方式来实例化bean

    在一步一步深入spring(1)--搭建和测试spring的开发环境中提到了一种实例化bean的方式,也是最基本的使用构造器实例化bean 1.使用构造器实例化bean:这是最简单的方式,Spring ...

  9. MapXtreme+Asp.net 动态轨迹(请求大神指点)

    功能简介:在MapXtreme+Asp.net的环境下实现轨迹回放功能,经过两天的努力基本实现此功能.但还有部分问题需要解决,求大神们指点迷津,问题会在结尾处提出. 客户端前台页面 <asp:S ...

  10. Spring注解用法

    1. Controller层:@Controller @Controller @RequestMapping("/user")//请求localhost:8080/user/*** ...