看过一些第三方开源类库的源代码,经常发现他们 给一个 类 添加了一个原本不存在的属性,
比如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 { [self willChangeValueForKey:@"StaticManagerKey"]; objc_setAssociatedObject(self, &StaticManagerKey, manager, OBJC_ASSOCIATION_RETAIN); [self didChangeValueForKey:@"StaticManagerKey"]; } - (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
下一篇:使用运行时来高度包装 AF和 HUD
总结:当我们使用 运行时方法给一个 类添加属性之后,我们就可以非常方便的使用它了