博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RunTime的使用-Category中增加实例变量
阅读量:5939 次
发布时间:2019-06-19

本文共 1525 字,大约阅读时间需要 5 分钟。

RunTime的使用-Category中增加实例变量

很久没遇到问题了,今天写类目的时候发现,在我们所创建的类目(Category)中 只能写方法不能写实例变量以及属性,但是这无疑非常不方便,于是这里用到RunTime 这样就能在类目中对属性进行赋值了。

下面我们介绍一个很巧妙的方法来解决:使用runtime库的 objc_setAssociatedObject / objc_getAssociatedObject 函数来解决。
这里只用到RunTime的2个方法,还有其他的方法
通过这相中方法,明眼人可以看到有set 与 get 的关键字  也就是说一个是设置一个是取值  
通过这种方法来模拟生成属性。
代码:
在.h文件中正常的声明一个属性,不要太浮夸
@property (nonatomic,retain)ZbarViewController *readerVC;
然后在.M中包含RunTime的头文件
#import <objc/runtime.h>
然后这步骤非常重要 我们需要一个关联的时候的Key来使用
,这个Key是用来存储用的
//常规用来标注的Key 万年不变三种写法
1static void *strKey = &strKey;
2static NSString *strKey = @"strKey"
3static char strKey;
这里我用第三种
 
static char AddressKey; 
之后开始调用RunTime的方法
//设置值
- (void)setAlloc:(ZbarViewController *)zBar
{
    objc_setAssociatedObject(self, &AddressKey, zBar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
objc_setAssociatedObject的方法,这个方法有四个参数,分别是:源对象(self),关联时的用来标记是哪一个属性的key(AddressKey)(因为你可能要添加很多属性),关联的对象(zBar)和一个关联策略(我前面声明属性用的是retain 所以这里用的是retain)。 
关联策略是一个枚举值 
enum { 
OBJC_ASSO
CIATION_ASSIGN = 0//关联对象的属性是弱引用 
OBJC_ASSO
CIATION_RETAIN_NONATOMIC = 1//关联对象的属性是强引用并且关联对象不使用原子性OBJC_ASSOCIATION_COPY_NONATOMIC = 3//关联对象的属性是copy并且关联对象不使用原子性
OBJC_ASSOCIATION_RETAIN = 01401//关联对象的属性是copy并且关联对象使用原子性 
OBJC_ASSO
CIATION_COPY = 01403 //关联对象的属性是copy并且关联对象使用原子性};
 
//取值
- (ZbarViewController *)get
{
    return objc_getAssociatedObject(self, &AddressKey);
}
然后初始化的方法  跟取值的方法分别为
 [self setAlloc:[ZbarViewController new]];   //调用set
    [self get].readerDelegate = self;    //调用Get 
这样就能在类目中使用属性了。

本文转自 卓行天下  51CTO博客,原文链接:http://blog.51cto.com/9951038/1794904,如需转载请自行联系原作者
你可能感兴趣的文章
CentOS7.2安装pure-ftpd 及其配置项
查看>>
Css实现checkbox及radio样式自定义
查看>>
Developing JSF applications with Spring Boot
查看>>
Android 6.0 变更
查看>>
MPAndroidChart market右边显示不全问题
查看>>
HTML中DOM对象的属性和方法的层级关系是怎样的?(目录即层次)
查看>>
【Windows】字符串处理
查看>>
Spring(十八):Spring AOP(二):通知(前置、后置、返回、异常、环绕)
查看>>
jinfo
查看>>
Redis详解(八)------ 主从复制
查看>>
CentOS使用chkconfig增加开机服务提示service xxx does not support chkconfig的问题解决
查看>>
微服务+:服务契约治理
查看>>
save
查看>>
Ubuntu使用小技巧
查看>>
Android DrawLayout + ListView 的使用(一)
查看>>
clear session on close of browser jsp
查看>>
asp.net mvc Post上传文件大小限制 (转载)
查看>>
关于吃掉物理的二次聚合无法实现的需要之旁门左道实现法
查看>>
mysql出现unblock with 'mysqladmin flush-hosts'
查看>>
oracle exp/imp命令详解
查看>>