一、相关函数

与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. 【IOS开发】UItextfield输入电话号码,自动调整格式

    UItextfield中实现输入电话号码,自动按位置在加“—”效果.效果图如下. 核心代码: -(BOOL)textField:(UITextField *)textField shouldChang ...

  2. map,set的模板[STL]

    之前写某题单词查找的时候,有用到set,晚上写codeforces#497 div2 D题有用到map 感觉set,map的功能挺类似的,在此小结: 这里就不具体比较相同点和不同点了,免得看起来乱七八 ...

  3. vijos1053 用spfa判断是否存在负环

    MARK 用spfa判断是否存在负环 判断是否存在负环的方法有很多, 其中用spfa判断的方法是:如果存在一个点入栈两次,那么就存在负环. 细节想想确实是这样,按理来说是不存在入栈两次的如果边权值为正 ...

  4. DedeCms密码解密[转]

    dede 的密码怎么破解,dede后台.32位的DEDE密码如何破解 dede 的密码是32位MD5减去头5位,减去尾七位,得到20 MD5密码,方法是,前减3后减1,得到16位MD5. 比如我的数据 ...

  5. 对Conjugate Gradient 优化的简单理解

    对Conjugate Gradient 优化的简单理解) 机器学习&数据挖掘笔记_12(对Conjugate Gradient 优化的简单理解) 数学优化方法在机器学习算法中至关重要,本篇博客 ...

  6. T_SQL查询语句(一): 单表查询

    ############################################ 查询语句--SELECT ########################################## ...

  7. python实现基于CGI的Web应用

    python实现基于CGI的Web应用 本文用一个“网上书店”的web应用示例,简要介绍如何用Python实现基于CGI标准的Web应用,介绍python的cgi模块.cigtb模块对编写CGI脚本提 ...

  8. 使用 javascript 来实现 观察者模式

    以[猫叫.老鼠跑.主人醒]为例子,使用 javascript 来实现 观察者模式 (有在线演示) 2013-06-24 08:35 by 金色海洋(jyk)阳光男孩, 572 阅读, 4 评论, 收藏 ...

  9. 终于说再见了!Google Reader

    终于说再见了!Google Reader 投递人 itwriter 发布于 2013-07-02 13:28 评论(5) 有760人阅读  原文链接  [收藏]  « » 今天 15:00 左右,Go ...

  10. angularjs控制器之间通信,事件通知服务

    service要记住一点就是所有的services都是singleton(单例)的,service更多的是做一些业务逻辑,数据交互.当然,利用单例这特点也可以用来做不同控制器间的通信.控制器间的通信也 ...