关于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 ...
随机推荐
- lnmp1.0 升级php.5.4.28 后出错 Nginx 502 Bad Gateway
碰到一个很奇怪的问题,用lnmp自带的./upgrade_php.sh升级 php5.4.27正常.但升级到php5.4.28就出错,访问p.php 提示:Nginx 502 Bad Gateway. ...
- FormsAuthentication知多少
前述:对于FormsAuthentication相信大家都烂熟于胸了,这里只是做一下小结. 一.先看一下使用FormsAuthentication做登录认证的用法 用法一: FormsAuthenti ...
- cocos2d-x-2.2.0_win7+vs2010
cocos2d-x-2.2.0_win7+vs2010搭建_eclipse+ndk-r9+cygwin搭建_教程以及编译问题汇总 声明:我是才用c/c++和cocos2d-x的如果有错误欢迎指出 文章 ...
- float的深入剖析
float的深入剖析 float是什么? float即为浮动,在html中的作用是使元素脱离正常的文档流并使其移动到其父元素的“最左边”或“最右边”.下面解释下这个定义中的几个名词的概念: 文档流 ...
- Dotliquid使用Json模板变量
Dotliquid是不错的Template Engine,为了更方便使用,扩展了一下,使它支持json数据的替换,引用了Newtonsoft.Json.Linq /// <summary> ...
- CSS案例
1.美团网效果 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...
- Python闭包详解
Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...
- Caffe Ubuntu14.04 64位 的最快安装 (cuda7.5 + cudnn7.0 2016最新)
最近因为各种原因,装过不少次Caffe,安装过程很多坑,为节省新手的时间,特此总结整个安装流程. 关于Ubuntu 版本的选择,建议用14.04这个比较稳定的版本,但是千万不要用麒麟版!!!比原版体验 ...
- 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)
技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...
- sql server数据库中删除的过程
这是在vb中的一个对数据库中数据的删除过程,点击按钮后程序第一句则是将你要删除的那条记录的位置作为书签保存到myBookmark这个变量里面,然后选择确定删除的话,首先执行if语句下的第一句 mrc. ...