[Objective-C] 通过objc_get/setAssociatedObject 在category里加入成员变量
来源:互联网 发布:网络口语培训哪家好 编辑:程序博客网 时间:2024/04/29 08:54
转自:http://www.th7.cn/Program/IOS/201406/218506.shtml
OC的category是一个非常好用的特性,它允许你在不改变源码的情况下扩展类的一些功能特性,从而能更好地组织你地代码。
但是使用category有一个很大地限制,不能在category里添加成员变量,这个限制较大地限制了category的使用,当然使用extension可以往类里面添加成员变量,但是extension要求你需要在original class 的实现类里面实现extension所添加的方法。所以extension不可能对拿不到源码的框架进行扩展。
对于category不能添加成员变量的限制,下面我们介绍一个很巧妙的方法来解决:使用runtime库的 objc_setAssociatedObject / objc_getAssociatedObject函数来解决。
objc_setAssociatedObject 的定义:
objc_getAssociatedObject 的定义:
可以看出objc_setAssociatedObject 就是将一个对象跟另一个对象进行关联,并用一个key来标示,objc_getAssociatedObject 就是用这个key来拿到与receiver相关联的一个对象。
objc_setAssociatedObject / objc_getAssociatedObject 来在category里添加成员变量非常简单,请看下面的一个简单的例子:
注意:
必须使用@dynamic来让编译器知道我们自己实现setter/getter方法(如果对于@dynamic有疑问,请参见:http://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences)
不能使用@synthesize(也不能@dynamic 和@synthesize都不写,什么都不写在最新的xcode里是默认@synthesize),@synthesize会自动生成成员变量,并自动生成setter/getter方法。
最后,objc_setAssociatedObject 的关联的policy 可以根据自己的需求使用,这个例子使用 OBJC_ASSOCIATION_RETAIN_NONATOMIC来标示一个strong reference来指向被关联的对象。
- [Objective-C] 通过objc_get/setAssociatedObject 在category里加入成员变量
- Objective-C如何在category里加入成员变量
- 在category里加入成员变量
- [Objective-C] 通过匿名category给category添加成员变量
- 如何在CSS文件里加入变量
- 在C++工程里加入C文件
- Objective-C 通过运行时遍历类所有成员变量
- objective-c category member variables (分类中也可以扩展成员变量)
- 在JPanel里加入背景图片
- 用来在category里加属性的宏
- 59.通过 runtime为Category添加属性与成员变量
- category添加成员变量
- 在TWebbrowser 里加入html文本
- 在DBGrid里加入CheckBox可视化组件
- JPA,在@OneToMany里加入mappedBy属性
- 在你的app里加入广告
- JPA,在@OneToMany里加入mappedBy属性
- 在jsp里加入java代码
- MySQL基础笔记(三) 复杂查询
- Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系
- mysql锁和索引之间的关系
- OC大补之法
- 在Ubuntu 11.04中执行sudo apt-get update命令时出现404错误
- [Objective-C] 通过objc_get/setAssociatedObject 在category里加入成员变量
- List,set,Map 的用法和区别
- 【Java 学习笔记】 HashMultimap(guava)
- Android学习 18 ->网格控件GridView
- DOM元素尺寸offsetWidth,scrollWidth,clientWidth等详解
- struts2学习笔记
- 多线程编程
- 分享 ASP.Net 网站设置 404错误跳转到指定页面的三种方法
- 算法导论(CLRS)答案