资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

RunTime的使用-Category中增加实例变量-创新互联

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

10年积累的网站制作、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有内黄免费网站建设让你可以放心的选择与我们合作。

很久没遇到问题了,今天写类目的时候发现,在我们所创建的类目(Category)中 只能写方法不能写实例变量以及属性,但是这无疑非常不方便,于是这里用到RunTime 这样就能在类目中对属性进行赋值了。
下面我们介绍一个很巧妙的方法来解决:使用runtime库的 objc_setAssociatedObject / objc_getAssociatedObject 函数来解决。
这里只用到RunTime的2个方法,还有其他的方法。
通过这相中方法,明眼人可以看到有set 与 get 的关键字 也就是说一个是设置一个是取值  ,通过这种方法来模拟生成属性。

代码:
在.h文件中正常的声明一个属性,不要太浮夸
@property (nonatomic,retain)ZbarViewController *readerVC;

然后在.M中包含RunTime的头文件
#import
然后这步骤非常重要 我们需要一个关联的时候的Key来使用,这个Key是用来存储用的
//常规用来标注的Key 万年不变三种写法
1、static void *strKey = &strKey;
2、static NSString *strKey = @"strKey";
3、static 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_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
这样就能在类目中使用属性了。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文名称:RunTime的使用-Category中增加实例变量-创新互联
网址分享:http://www.cdkjz.cn/article/ecods.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220