OBJc在Category中实现属性

作者: 代码干货 | 来源:发表于2015-05-18 14:19 被阅读187次

做开发时我们常常会需要在已经实现了的类中增加一些方法,这时候我们一般会用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

相关文章

  • OBJc在Category中实现属性

    做开发时我们常常会需要在已经实现了的类中增加一些方法,这时候我们一般会用Category的方式来做。但是这样做我们...

  • Objective-C Category

    Category的底层结构 在objc源码objc-runtime-new.h中可以找到 Category的实现原...

  • OC语言之Category源码实现

    Category源码实现 objc4-750.1版本中Category的定义如下: Category的加载流程 在...

  • runtime常用的几种使用场景:

    1.category中添加属性 category里面是没法直接添加属性的,但是通过runtime的方式可以实现。主...

  • ios category

    category的底层结构 定义在objc-runtime-new.h中 源码解读顺序 objc-os.mm文件中...

  • 笔记 - Category

    1、Category的基本使用 2、Category的实现原理? 3、源码分析1 objc4-723.tar.gz...

  • 探寻Category

    Category的底层结构 在源码的中,我们可以查看到Category的底层结构(objc-runtime-new...

  • iOS开发(7)Category/load/initialize

    Category的底层结构 定义在objc-runtime-new.h中1.png Category的加载处理过程...

  • iOS日记6-关联对象

    1.使用场景 1.添加私有属性,用于更好地实现细节(声明在实现文件中)2.添加公有属性,增强category的功能...

  • category探究

    category本质 category attach2Class objc-os.mm objc-runtime-...

网友评论

    本文标题:OBJc在Category中实现属性

    本文链接:https://www.haomeiwen.com/subject/ypqlqttx.html