您的位置:首页 > 运维架构

通过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了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息