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
总结:当我们使用 运行时方法给一个 类添加属性之后,我们就可以非常方便的使用它了
- iOS高级编程-使用类目方法给一个类添加属性
- IOS 给类目添加属性
- objc_runtime给类目添加属性关联(objc_setAssociatedObject、objc_getAssociatedObject)
- 类目中添加属性
- iOS用runtime给一个类动态添加方法 ---class_addMethod
- 给UIColor添加一个随机色的类目
- category 给IOS原生类添加属性
- iOS给UIButton添加一个新的属性
- 类目——为可变字符串类添加一个检测是不是有重复字母的方法
- iOS runtime 机制 通过别扩展category给一个类添加属性
- iOS给已有类添加属性
- iOS 给类别添加属性
- IOS开发使用@IBInspectable给控件添加额外属性
- iOS给分类添加属性时使用 @selector()原理详解
- 类目Extension:给NSArrary扩展一个方法,该方法可以返回一个倒置数组
- iOS类添加方法、属性学习笔记
- iOS - 如何给1个类添加属性
- iOS 利用运行时机制给现有类添加属性
- PHP 开发社区微信服务号实战图解
- 使用 Scala 编写 Android 应用
- python获取指定目录下的所有指定后缀的文件名
- 成为嵌入式开发工程师几个步骤
- winpcap实现从TCP三次握手到发送http请求
- iOS高级编程-使用类目方法给一个类添加属性
- 玩游戏学前端——看您的细节把握能力
- [python][爬虫]暴漫gif下载
- 【c语言】先后输出BOY三个字符
- TOP-K排序算法,从海量不重复数据中找出最大/小的K个数
- ORA-32001: write to SPFILE requested but no SPFILE specified at startup问题的解决
- zoj 1597 Circular Area(求两圆相交的面积)
- Andriod 内存泄露问题的整理
- Nginx 配置文件详解