做开发时我们常常会需要在已经实现了的类中增加一些方法,这时候我们一般会用Category的方式来做。但是这样做我们也只能扩展一些方法,而有时候我们更多的是想给它增加一个属性。由于类已经是编译好的了,就不能静态的增加成员了,这样我们就需要自己来实现getter和setter方法了,在这些方法中动态的读写属性变量来实现属性。一种比较简单的做法是使用Objective-C运行时的这两个方法:
<pre>
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
id objc_getAssociatedObject(id object, const void *key);
</pre>
这两个方法可以让一个对象和另一个对象关联,就是说一个对象可以保持对另一个对象的引用,并获取那个对象。有了这些,就能实现属性功能了。 policy可以设置为以下这些值:
<pre>
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
</pre>
这些值跟属性定义中的nonatomic,copy,retain等关键字的功能类似。
Example
下面是一个属性自定义getter和setter的例子:
<pre><code>
NSString const * kExposeController = @"exposeController";
-(UIViewController *)exposeController {
return (UIViewController *)objc_getAssociatedObject(self, kExposeController);
}
-(void)setExposeController:(UIViewController *)exposeController {
objc_setAssociatedObject(self, kExposeController, exposeController, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
</code></pre>
可以看出使用objc_setAssociatedObject和objc_getAssociatedObject函数可以很方便的实现属性的getter和setter。
原文连接
OBJc在Category中实现属性
拓展阅读 http://stackoverflow.com/questions/5909412/what-is-objc-setassociatedobject-and-in-what-cases-should-it-be-used
Adding Properties to an Objective-C Category
Objective-C: Property / instance variable in category