先来看一下Category的定义
Catagory是Objective-C提供了一种特别设计模式,一般称为扩展类,
或分类,使用Catagory,不需要访问类的源代码,也不需要创建类的子类,就可以为原有的类添加方法。但是,Category只能给类扩展方法,不能扩展成员属性或变量,原因不在本篇谈论范围内,下一篇我们再做探讨。
我们看一下使用Category添加方法的用法(为NSArray添加Json转换的方法):
在 NSArray+JsonString.h文件中
@interface NSArray (JsonString)
-(NSString*) jsonString;
@end
在 NSArray+JsonString.m文件中
@implementation NSArray (JsonString)
-(NSString*) jsonString {
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self
options:NSJSONWritingPrettyPrinted
error:&error];
if (! jsonData) {
NSLog(@"jsonStringWithPrettyPrint: error: %@", error.localizedDescription);
return @"{}";
} else {
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
}
@end
使用方式:
NSArray *array = [[NSArray alloc]init];
NSString *json = [array jsonString];
在上面代码中,我们通过类别为NSArray新增了一个方法jsonString,通过该方法进行json转换,这是Category常规的用法,接下来就是本文的重点了,利用Category + RunTime 为基类新增成员属性,
在 NSArray+JsonString.h文件中
@property (nonatomic,strong) Class objClass;//为分类申明新对象
在 NSArray+JsonString.m文件中
- (void)setObjClass:(Class)objClass
{
objc_setAssociatedObject(self, @selector(objClass), objClass, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (Class)objClass
{
return objc_getAssociatedObject(self, _cmd);
}
在上面的代码中,我们成功为基类NSArray增加了一个objClass的成员属性,在json转model的过程中,我们就可以将NSArray中的数据封装成objClass对象。
为什么不能在Category分类中可以直接新增方法,而属性却不能,为什么利用runtime就可以增加属性?这涉及到app内存区域的分配机制,我们将在下一篇讲解