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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,838评论 0 9
  • 终于把前面的base文件夹简简单单的看了一遍,终于可以回到正片上来了,保证不烂尾。 项目天天用yymodel解析数...
    充满活力的早晨阅读 1,407评论 1 0
  • 面向对象三大支柱封装:就是把相关的数据和代码结合成一个有机的整体,形成数据和操作代码的封装体,对外只提供一个可以控...
    WangDavid阅读 1,745评论 0 2
  • 1、禁止手机睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa阅读 1,152评论 1 6
  • 说白了还是消费观的问题。。。我以前经年累月出差,信奉穷家富路,出来就应该当花则花;某人艳羡走天涯,喜欢学人家找虐(...
    刻薄留在家门外阅读 260评论 6 0