美文网首页iOS进阶移动开发
Category + RunTime 动态添加成员属性

Category + RunTime 动态添加成员属性

作者: 陈贺年 | 来源:发表于2016-12-30 21:33 被阅读11次

    先来看一下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 动态添加成员属性

      本文链接:https://www.haomeiwen.com/subject/fctvvttx.html