博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS-浅谈runtime运行时机制-runtime简单使用(转)
阅读量:6819 次
发布时间:2019-06-26

本文共 1321 字,大约阅读时间需要 4 分钟。

转自http://www.cnblogs.com/guoxiao/p/3583432.html

由于OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法。利用runtime机制让我们可以在程序运行时动态修改类、对象中的所有属性、方法。

  下面就介绍运行时一种很简单的使用方式,将字典对象转为模型。当然,你可能会问,我用KVO直接调用 setValuesForKeysWithDictionary:方法,传入一个字典一样可以快速将字典转模型啊,但是这种方法有它的弊端,只有遍历某个 模型中所有的成员变量,然后通过成员变量从字典中取出对应的值并赋值最为稳妥,否则,当模型中的属性数量与字典中的key的数量不一样时,就会报错。而 且,由于runtime是更底层的语言,我们编写的OC代码在运行时,编译器内部会先转为C和C++的代码,然后再执行,因而运用runtime机制,程 序的性能也会更好。说了这么多,下面就初步认识一下runtime的强大。

  首先,我们定义一个类

@interface Person : NSObject{    CGFloat height;}@property (nonatomic, copy) NSString *name;@property (nonatomic, strong) NSNumber *age;@property (nonatomic, assign) int no;@end

  然后,我们在其它文件中使用这个类,注意在使用之前,要包含 #import <objc/message.h>

 下面通过一小段代码来获取到上面这个类中所有的成员变量

unsigned int outCount = 0;    Ivar *vars = class_copyIvarList([Lender class], &outCount); // 获取到所有的成员变量列表        // 遍历所有的成员变量    for (int i = 0; i < outCount; i++) {        Ivar ivar = vars[i]; // 取出第i个位置的成员变量                const char *propertyName = ivar_getName(ivar); // 获取变量名        const char *propertyType = ivar_getTypeEncoding(ivar); // 获取变量编码类型        printf("---%s--%s\n", propertyName, propertyType);    }

打印结果:

---height--f---_name--@"NSString"---_age--@"NSNumber"---_no--i 可见,通过上面几句简单的代码就可以获取到某个类中所有变量的名称和类型,然后通过object_setIvar()方法为具体某个对象的某个成员变量赋值。

转载于:https://www.cnblogs.com/zhangyang17/p/3608022.html

你可能感兴趣的文章
Linq-C#左连接
查看>>
c和指针读书笔记
查看>>
常用正则表达式集锦
查看>>
JS 验证
查看>>
【Lua】特性和一些基础语法
查看>>
Jaxb2 实现JavaBean与xml互转
查看>>
Mac OSX简单使用中会用到的
查看>>
Firefox 23中的新特性(新陷阱)
查看>>
SQL Server 造成cpu 使用率高的 6 原因
查看>>
MYSQL <=>运算符
查看>>
unable to access android sdk add-on list
查看>>
由.NET说到WCF(未完成)
查看>>
用motion实现家庭视频监控
查看>>
帝国cms缩略图:网站不同地方生成不同的缩略图
查看>>
python Django Ajax基础
查看>>
aop point-cut表达式
查看>>
easyui的 getSelections 与 getSelected 对比区别
查看>>
后缀数组模板 UOJ#35. 后缀排序
查看>>
[转]DirectX Rendering Pipeline渲染管线图
查看>>
ImageMaigck不支持中文路径的问题
查看>>