让Category支持添加属性与成员变量【转载】
2015-11-30 20:08
417 查看
Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
上面是头文件声明,下面的实现的.m文件:
通过这些函数,你可以在调试时(通过po命令)或者运行时获得对象的各种信息。
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
//NSObject+IndieBandName.h @interface NSObject (IndieBandName) @property (nonatomic, strong) NSString *indieBandName; @end
上面是头文件声明,下面的实现的.m文件:
// NSObject+IndieBandName.m #import "NSObject+Extension.h" #import <objc/runtime.h> static const void *IndieBandNameKey = &IndieBandNameKey; @implementation NSObject (IndieBandName) @dynamic indieBandName; - (NSString *)indieBandName { return objc_getAssociatedObject(self, IndieBandNameKey); } - (void)setIndieBandName:(NSString *)indieBandName{ objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end
DLIntrospection
这个和Category无关,但是也是runtime.h的一种应用。DLIntrospection,是 一个NSObject Category。它为NSObject提供了一系列扩展函数:@interface NSObject (DLIntrospection) + (NSArray *)classes; + (NSArray *)properties; + (NSArray *)instanceVariables; + (NSArray *)classMethods; + (NSArray *)instanceMethods; + (NSArray *)protocols; + (NSDictionary *)descriptionForProtocol:(Protocol *)proto; + (NSString *)parentClassHierarchy; @end
通过这些函数,你可以在调试时(通过po命令)或者运行时获得对象的各种信息。
相关文章推荐
- <18> go time
- googletest 学习笔记
- Django学习记录之Django 1.8 教程(我只是官网的搬运工)Tutorial Part 2
- Gof-23种设计模式名称列表
- Django学习记录之Django 1.8 教程(我只是官网的搬运工)Tutorial Part 1
- Mongo数据迁移-单个collection的迁移
- Mongo解决注册码到期的问题
- Google Tensorflow 源码编译(三):tensorflow<v0.5.0>
- 解决启动mongod 时,出现addr already in use错误
- FMDB&EGODatabase(数据持久化)
- django1.6.11配置静态文件
- Golang学习摘录(二)
- 民意调查Django实现(二)
- django数据源操作(多数据源,导入导出等)
- Go-简洁的并发
- 单纯形算法求解线性规划问题(依据《算法导论》实现)
- The good site to buy rs 2007 gold cheap on RSorder with pay by Paypal or Alipay without anyconfirmat
- Django model各个字段类型
- 不错的Django技术网址
- django使用通用视图 django.views.generic