Category + RunTime 动态添加成员属性

先来看一下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内存区域的分配机制,我们将在下一篇讲解

你可能感兴趣的:(Category + RunTime 动态添加成员属性)