本文共 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 万年不变三种写法1、static void *strKey = &strKey;2、static NSString *strKey = @"strKey"; 3、static char strKey;这里我用第三种
static char AddressKey;
objc_setAssociatedObject
的方法,这个方法有四个参数,分别是:源对象(self),关联时的用来标记是哪一个属性的key(AddressKey)(因为你可能要添加很多属性),关联的对象(zBar)和一个关联策略(我前面声明属性用的是retain 所以这里用的是retain)。 关联策略是一个枚举值 enum { OBJC_ASSOCIATION_ASSIGN = 0, //关联对象的属性是弱引用 OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //关联对象的属性是强引用并且关联对象不使用原子性OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //关联对象的属性是copy并且关联对象不使用原子性OBJC_ASSOCIATION_RETAIN = 01401, //关联对象的属性是copy并且关联对象使用原子性 OBJC_ASSOCIATION_COPY = 01403 //关联对象的属性是copy并且关联对象使用原子性};
//取值 - (ZbarViewController *)get { return objc_getAssociatedObject(self, &AddressKey); }然后初始化的方法 跟取值的方法分别为 [self setAlloc:[ZbarViewController new]]; //调用set [self get].readerDelegate = self; //调用Get 这样就能在类目中使用属性了。