关于runtime(动态访问对象的属性)

动态的访问对象的属性和方法,并通过kvc赋值,也就是字典转模型,有利于提高代码的运行效率.为此写了个小demo,本人iOS菜鸟一个,喜欢的拿去,不喜欢的勿喷!!!

1.首先我们创建个继承与NSObject的Person类


Person.h
Person.m

2.创建Runtime的分类 NSObject+runtime


NSObject+Runtime.h

一下是NSObject+Runtime.m

#import "NSObject+Runtime.h"

#import@implementation NSObject (Runtime)

const char * kPropertiesListKey="HWBPropertiesListKey";

+(NSArray *)hwb_objcProperties

{

// --- 1. 从`关联对象`中获取对象属性,如果有,直接返回!

/**

获取关联对象 - 动态添加的属性

参数:

1. 对象 self

2. 动态属性的 key

返回值

动态添加的`属性值`

*/

NSArray *ptyList = objc_getAssociatedObject(self, kPropertiesListKey);

if (ptyList != nil) {

return ptyList;

}

// 调用运行时方法,取得类的属性列表

// Ivar 成员变量

// Method 方法

// Property 属性

// Protocol 协议

/**

参数

1. 要获取的类

2. 类属性的个数指针

返回值

所有属性的`数组`,C 语言中,数组的名字,就是指向第一个元素的地址

retain/create/copy 需要 release,最好 option + click

*/

unsigned int count = 0;

objc_property_t *proList = class_copyPropertyList([self class], &count);

NSLog(@"属性的数量 %d", count);

// 创建数组

NSMutableArray *arrayM = [NSMutableArray array];

// 遍历所有的属性

for (unsigned int i = 0; i < count; i++) {

// 1. 从数组中取得属性

/**

C 语言的结构体指针,通常不需要 `*`

*/

objc_property_t pty = proList[i];

// 2. 从 pty 中获得属性的名称

const char *cName = property_getName(pty);

NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];

//        NSLog(@"%@", name);

// 3. 属性名称添加到数组

[arrayM addObject:name];

}

// 释放数组

free(proList);

// --- 2. 到此为止,对象的属性数组已经获取完毕,利用关联对象,动态添加属性

/**

参数

1. 对象 self [OC 中 class 也是一个特殊的对象]

2. 动态添加属性的 key,获取值的时候使用

3. 动态添加的属性值

4. 对象的引用关系

*/

objc_setAssociatedObject(self, kPropertiesListKey, arrayM.copy, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

return arrayM.copy;

}

// 所有字典转模型框架,核心算法!

+(instancetype)hwb_objcWithDict:(NSDictionary *)dict{

// 实例化对象

id object=[[self alloc]init];

// 1> 获得 self 的属性列表

NSArray *proList=[self hwb_objcProperties];

// 2> 遍历字典

[dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

NSLog(@"key %@ --- value %@", key, obj);

// 3> 判断 key 是否在 proList 中

if ([proList containsObject:key]) {

//  说明属性存在,可以使用 `KVC` 设置数值

[object setValue:obj forKey:key];

}

}];

return object;

}

@end

3.在ViewController类里面

ViewController.m

代码不是很多,直接上图片了,喜欢了解oc运行时的朋友可以看下.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,865评论 0 9
  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 9,101评论 7 64
  • 转载:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麦子阅读 4,119评论 0 2
  • 看着闪烁的屏幕,脑子里一团浆糊。手指落在“Enter”上不知道多久了,就是按不下去。 ​茶叶已经泡的没有了味道,再...
    愚柮阅读 1,747评论 0 0
  • 拆书训练营10:沟通模式的四个要素 ·来自:《非暴力沟通》 ·目标:了解并尝试使用非暴力沟通的四要素 R阅读原文 ...
    杨树叶儿阅读 1,157评论 0 0

友情链接更多精彩内容