关于Objective-C Associated Objects
一、相关函数
与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的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Object Pascal中文手册 经典教程
Object Pascal 参考手册 (Ver 0.1)ezdelphi@hotmail.com OverviewOverview(概述)Using object pascal(使用 object p ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- C++ vs Objective C
oc Short list of some of the major differences: C++ allows multiple inheritance, Objective-C doesn't ...
- 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 ...
- #学习笔记# 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 ...
- Objective -C Categories
Objective -C Categories The dynamic runtime dispatch mechanism employed by Objective-C lets you add ...
- Objective -C Object initialization 对象初始化
Objective -C Object initialization 对象初始化 1.1 Allocating Objects 分配对象 Allocation is the process by w ...
- Objective -C Memory Management 内存管理 第一部分
Objective -C Memory Management 内存管理 第一部分 Memory management is part of a more general problem in pr ...
- Objective - c Foundation 框架详解2
Objective - c Foundation 框架详解2 Collection Agency Cocoa provides a number of collection classes such ...
随机推荐
- 用NPOI实现导入导出csv、xls、xlsx数据功能
用NPOI实现导入导出csv.xls.xlsx数据功能 直接上代码 首先定义一个接口 如果需要直接操作文件的话,就自己在封装一次 然后定义csv类的具体实现 这个需要引入命名空间LumenWo ...
- dedecms模板中使用php代码
{dede:php} echo “test”: {/dede:php} 使用这段代码之前要在后台的系统--系统基本参数--其它选项 里找到 模板引擎禁用标签: php 将其删除
- SuperMap iClient
SuperMap iClient 7C——网络客户端GIS开发平台 产品新特性 SuperMap iClient 7C是空间信息和服务的可视化交互开发平台,是SuperMap服务器系列产品的统一客 ...
- Java并发性和多线程介绍
java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题,多开线程就好: 快速响应,异步式 ...
- IOS开发之路三(XML解析之GDataXML的使用)
最近再做一个项目需要用到xml的解析.今天查了一些资料自己做了一个小demo.纯OC没有界面.. 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用 ...
- SharePoint SPHierarchyDataSourceControl+SPTreeView
今天使用SPHierarchyDataSourceControl和SPTreeView来显示SharePoint文档库层级结构的过程中,发现一直在报下面的错误: The target 'ctl00$c ...
- SOCKET网络编程细节问题1
SOCKET网络编程快速上手(二)——细节问题(1) 三.细节问题一个也不能少 Socket编程说简单也简单,程序很容易就能跑起来,说麻烦还真是麻烦,程序动不动就出问题.记得刚开始写网络代码的时候,那 ...
- .NET:脏读、不可重复读和幻读测试
目录 背景脏读原因重现和避免不可重复读原因重现和避免幻读原因重现和避免嵌套事务导致的死锁备注 背景返回目录 昨天才发现如果一条数据被A事务修改但是未提交,B事务如果采用“读已提交”或更严格的隔离级别读 ...
- phpredis扩展
<?php $redis = new Redis(); $redis->connect('127.0.0.1',6379); $redis->set('test','hello wo ...
- python tornado nginx deployment tornado 的部署在linux Nginx服务器
题外话: 这里分享一个链接是将Flask 和 Apache 用 mod_wsgi 来进行传唤的部署方式,在digital ocean VPS 上的. https://www.digitalocean. ...