美文网首页
关于runtime(动态访问对象的属性)

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

作者: iOS_Hwb | 来源:发表于2017-04-03 19:00 被阅读0次

动态的访问对象的属性和方法,并通过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运行时的朋友可以看下.

相关文章

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

    动态的访问对象的属性和方法,并通过kvc赋值,也就是字典转模型,有利于提高代码的运行效率.为此写了个小demo,本...

  • RunTime - 方法交换

    上篇我们讲到了runtime 的动态添加属性和方法,遍历对象的属性列表,今天我们来讲一下runtime里面更好用的...

  • runtime简单使用之动态添加属性

    runtime简单使用之给系统类动态添加属性 前言 1, 给类动态添加属性,实质就是让一个属性与某个对象产生关联的...

  • 面试

    KVC KVC可以通过key直接访问对象的属性,或者给对象的属性赋值(包括私有属性),这样可以在运行时动态的访问或...

  • 面向对象01-对象的动态特性

    对象的动态特性 在js中可以动态的对对象属性进行增加、修改和删除 访问对象的方法 01 可以使用点语法访问 02 ...

  • 如何通过 Runtime 获取对象的属性

    Runtime 的应用场景:关联对象: (1).仿照 SDWebImage- <1>给分类动态添加属性;- <2>...

  • runtime的理解(二)

    主要内容 利用 runtime 交换方法 利用 runtime 动态添加方法 利用 runtime 动态添加属性 ...

  • KVO的实现原理

    一、底层实现步骤 需求:观察对象Person,观察属性name 利用runtime动态创建(objc_alloca...

  • 004-runtime动态添加属性

    1、使用场景 使用runtime动态添加属性,目的就上让某个属性与对象产生关联 需求:让NSObject类,保存一...

  • KVC & KVO原理

    1、KVC KVC可以通过key直接访问对象的属性,或者给独享的属性直接赋值,这样可以在运行时动态的访问或修改对象...

网友评论

      本文标题:关于runtime(动态访问对象的属性)

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