通过OCRuntime为Category添加property实现
2015-10-09 15:52
288 查看
一般来讲,Category可以为现有类添加方法,也可以为现有类声明property,但是无法自动为相应的property生成实现代码。也就是说,即使你通过Category给类添加了property,你也没法通过"self.name"的形式访问property。但是!有了Runtime的帮忙,这都不是问题了。例如,我打算给NSArray类添加一个property(name),可以声明如下:
@interface NSArray (Swizzling) @property (strong, nonatomic)NSString *name; @end在NSArray+Swizzling.m中可以如下写:
@implementation NSArray (Swizzling) @dynamic name;//使用dynamic声明,也可不写这句 ... @end到此为止,如果你直接使用如下方式调用name,则会报错:
NSArray *arr=[NSArray arrayWithObjects:@"aa",@"bb",@"cc",nil]; arr.name=@"layne";“-[__NSArrayI setName:]: unrecognized selector sent to instance 0x7fa3c9524700”显示name属性没有响应的访问方法。因此为了使得name属性可以像正常属性一样被访问,需要自定义accessor。代码如下:
@implementation NSArray (Swizzling) - (void)setName:(NSString *)name{ objc_setAssociatedObject(self,@selector(name),name,OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (NSString *)name{ NSString *n = objc_getAssociatedObject(self, @selector(name)); return n; } @end这样,就可以通过arr.name的方式访问property了~
相关文章推荐
- Exchange server 2010 Event ID 106错误解决方案
- iOS学习系列 - 扩展机制category与associative
- NSCFString !!!通常遇到这个东西造成崩溃都是由于NSString类型实用不当。应仔细检查
- Category,protocol,Block总结对比
- 黑马程序员——OC基础:block和Protocol及Category
- 为category添加属性和成员变量
- IOS中的关联对象实现objc_setAssociatedObject
- WordPress-当文章属于两个或多个分类时,使其在不同的分类使用不同文章模板的方法
- Objective-C的协议、Blocks、Category
- 类别和类扩展的区别
- OC新语法-Category分类定义及用途
- Objective-C如何在category里加入成员变量
- OC语法<3.1> OC中特有的语法:Category分类
- objective-c---分类(category)、类的深入研究、NSLog、description方法
- Android Manifest之<category>元素中文注释
- AndroidManifest文件介绍
- iOS中为category添加@property支持
- objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects
- android.intent.action.MAIN 和android.intent.category.LAUNCHER
- 【python项目实战】BBS论坛(3)页面输出数据,及跳转