iOS高级编程-使用类目方法给一个类添加属性

来源:互联网 发布:数据库缓存redis框架 编辑:程序博客网 时间:2024/06/10 20:14

看过一些第三方开源类库的源代码,经常发现他们 给一个 类 添加了一个原本不存在的属性,

比如PPrealSideController 就给 UIViewController添加了一个 self.pprealSideController的属性?

他是如何实现的呢?


1.基本的实现思路


首先我们需要了解,实际上 在我们使用  类似于self.newProperty的语句的时候,

根据点语法的规则实际上是调用的  setNewProperty方法,和  newProperty方法,

那我们可以知道他肯定是给一个  UIViewController添加了一个类目,然后 给它添加了

set和get方法(同上),所以看到这里我们可以知道 他添加的  self.newProperty实际上

只是一个形式上的属性,当你使用 _newProperry的时候是不可以的!

所以这种形式的'属性' 只能使用点的形式去调用.


2.使用runtime方法来建立关联


虽然我们知道了可以使用类目给一个类添加两个方法,也就是间接的属性,

但是如何把我们需要存储的 属性值  和它关联起来呢?

在  <objc/runtime.h>运行时框架里给我们提供了关联对象的方法,可以让我们 用一个静态的 key

给 一块内存 赋值,方然也可以使用这个 key 获取到对应的 值


对应的方法是:

    objc_setAssociatedObject(self, &StaticManagerKey,                             manager,                             OBJC_ASSOCIATION_RETAIN);


和 

objc_getAssociatedObject(self, &StaticManagerKey);


使用示例:

我们给一个 UIViewController类添加一个 manager属性:

我们需要建立一个 UIViewController类目,详细代码如下:

.h

////  UIViewController+BBManager.h//  HuanYouWang////  Created by MBinYang on 15/4/23.//  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.//#import <UIKit/UIKit.h>#import "BBRequest.h"@interface UIViewController ()@property(strong,nonatomic)BBRequest *manager;@end@interface UIViewController (BBManager)@end

可以看到 我们给UIViewController添加了一个 manager属性 ,实际上这个属性的 作用就是 给我们在.h中提供 一个 setManager方法,和 manager方法;


.m

////  UIViewController+BBManager.m//  HuanYouWang////  Created by MBinYang on 15/4/23.//  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.//#import "UIViewController+BBManager.h"#import <objc/runtime.h>@implementation UIViewController (BBManager)static char StaticManagerKey;- (void)setManager:(BBRequest *)manager{        objc_setAssociatedObject(self, &StaticManagerKey,                             manager,                             OBJC_ASSOCIATION_ASSIGN);}- (BBRequest *)manager{    return objc_getAssociatedObject(self, &StaticManagerKey);}@end

可以看到 ,我们在  .m中,实现了  set,get方法.


使用示例,我们在一个 UIViewController的子类中测试   :

在TestViewController中 导入

UIViewController+BBManager.h

然后测试:

self.manager = [[BBRequest alloc]init];//调用 set方法    [self.manager doSomething];//调用  get方法

可以看到 我们 为 一个  UIViewController成功添加了一个 属性  manager.


更多原文:http://blog.csdn.net/yangbingbinga



总结:当我们使用 运行时方法给一个 类添加属性之后,我们就可以非常方便的使用它了







0 0
原创粉丝点击