runtime-给系统已有类添加属性
2016-05-06 20:23
141 查看
在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种。类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添加的方法可以被此类的子类所继承;延展(extension)为我们的自定义类添加属性和方法,但是添加的属性和方法都是私有的,在此类的子类中是无法访问的。那么问题来了,如果我们想给系统已有类添加一些方便我们使用的属性要怎么办呢?上述这两种方法中能给系统已有类添加的东西的就只有类目(category)了。
如何利用runtime给系统已有类添加属性?下面用NSDictionary来举例
首先我们给NSDictionary创建一个类目,并在.h文件中添加一个属性
一般情况下我们在类目(category)中添加属性在外面使用的时候就是报错
为了不报错需要我们在.m文件中实现name属性的setter、getter方法
实现了name属性的setter和getter方法之后我们就把新添加的name属性和NSDictionary类关联起来了,现在在外面使用name属性就不会报错了!
如何利用runtime给系统已有类添加属性?下面用NSDictionary来举例
首先我们给NSDictionary创建一个类目,并在.h文件中添加一个属性
#import <Foundation/Foundation.h> @interface NSDictionary (MyDic) @property (nonatomic, copy) NSString *name; @end
一般情况下我们在类目(category)中添加属性在外面使用的时候就是报错
为了不报错需要我们在.m文件中实现name属性的setter、getter方法
- (void)setName:(NSString *)name { /** * 为某个类关联某个对象 * * @param object#> 要关联的对象 description#> * @param key#> 要关联的属性key description#> * @param value#> 你要关联的属性 description#> * @param policy#> 添加的成员变量的修饰符 description#> */ objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC); } - (NSString *)name { /** * 获取到某个类的某个关联对象 * * @param object#> 关联的对象 description#> * @param key#> 属性的key值 description#> */ return objc_getAssociatedObject(self, @selector(name)); }
实现了name属性的setter和getter方法之后我们就把新添加的name属性和NSDictionary类关联起来了,现在在外面使用name属性就不会报错了!
相关文章推荐
- 要不要冗余字段
- 解决魅族手机在下拉刷新的时候出现hold
- centos6.5 安装和卸载R
- Android 设置字体
- 观察者模式:使对象关注感兴趣的变化
- 原生JS投票特效
- 回调函数与函数指针
- PAT1001A+B Format (20)
- Manacher算法求字符串的最长回文子串
- Android编程权威指南学习笔记02
- C++STL中vector容器的用法
- 懒加载时,点语法使用注意事项
- 策略模式:把会变化的部分取出并封装起来
- hdu 5172(RMQ+前缀和)
- Rebase
- 堆排序
- HDU 2102 A计划 (搜索 队列)
- 金蝶软件校园招聘Java开发工程师笔试面试情况分享
- 多线程与线程池总结
- 保存特殊字符到utf8编码的mysql数据库中