由于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
可见,通过上面几句简单的代码就可以获取到某个类中所有变量的名称和类型。

转载于:https://www.cnblogs.com/fanjing/p/4538794.html

浅谈runtime运行时机制相关推荐

  1. iOS的runtime运行时机制

    本文转自http://www.cnblogs.com/guoxiao/p/3583432.html 最近一直在研究runtime运行时机制的问题,我想可能也有很多人不太清楚这个问题吧?在这里跟大家沟通 ...

  2. 编译器设计-RunTime运行时环境

    编译器设计-RunTime运行时环境 Compiler Design - Run-Time Environment 作为源代码的程序仅仅是文本(代码.语句等)的集合,要使其活动,它需要在目标计算机上执 ...

  3. 浅谈ASP.NET内部机制(五)

    浅谈ASP.NET内部机制(五) 前言:本章要谈页面生命周期了,过程挺多的,但是一点都不难.不信可以看看.我尽量的讲的平实一些,而且理解页面的生命周期对喜欢开发自定义控件和组件的朋友是很有帮助的. 系 ...

  4. 浅谈 LiveData 的通知机制

    LiveData 和 ViewModel 是 Google 官方的 MVVM 架构的一个组成部分.巧了,昨天分析了一个问题是 ViewModel 的生命周期导致的.今天又遇到了一个问题是 LiveDa ...

  5. ajax机制 缓存,浅谈Ajax的缓存机制

    浅谈Ajax的缓存机制 Ajax的缓存机制和浏览器处理资源时的缓存机制是一样的. 三条简单规则: 只要是URL相同的GET请求,浏览器会使用缓存(当然还要看服务器的Cache-Control/Expi ...

  6. python出现traceback什么意思_浅谈python出错时traceback的解读

    写 Python 代码的时候,当代码中出现错误,会在输出的时候打印 Traceback  错误信息,很多初学者看到那一堆错误信息,往往都会处于懵逼状态,脑中总会冒出一句,这都是些啥玩意.如果你是第一次 ...

  7. 趣谈iOS运行时的方法调用原理

    一个成熟的计算机语言必然有丰富的体系,复杂的容错机制,处理逻辑以及判断逻辑.但这些复杂的逻辑都是围绕一个主线丰富和展开的,所以在学习计算机语言的时候,先掌握核心,然后了解其原理,明白程序语言设计的实质 ...

  8. js 单页面ajax缓存策略,浅谈ajax的缓存机制---IE浏览器方面

    这篇文章主要介绍了IE浏览器关于ajax的缓存机制,文中给大家提到了Ajax解决浏览器的缓存问题,解决方法有很多种.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. IE浏览器对于同一 ...

  9. Objective-C Runtime 运行时之四:Method Swizzling

    理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...

最新文章

  1. 科软2020计算机科学与技术,2020新高考 报考计算机类专业怎么选科
  2. 百度智能小程序开源联盟正式成立 小程序开发创业又一新风向标
  3. Linux_指令杂烩
  4. 【摩天好课推荐】1 Python简介
  5. HTML第十章作业代码,HTML教程10第十章.doc
  6. Linux之sed:修改器按照字符和行数进行筛选和替换行值 选项[动作
  7. linux管理员常用的命令分享
  8. UE4学习-虚幻4帮助手册、通过蓝图实现动画效果、添加时间轴、添加声音、C++和蓝图事件关联
  9. js将docx转换为html,js 将word转换Html
  10. 用implicit和explicit打通两种类型
  11. 小程序 const moment = require('moment')_小程序依赖分析实践
  12. gin 源码解析 - 详解http请求在gin中的流转过程
  13. 微信公众号开发获取code
  14. 关于E-R(实体-联系)图
  15. 2018年10月Top 10机器学习开源项目
  16. Alien Skin Exposure X5 Bundle Mac(PS/LR照片胶片滤镜插件)
  17. Encountered a duplicated sql alias [id] during auto-discovery of a native-sq
  18. 求负片灰度扩展幂律变换
  19. 小红书商业生态产品负责人精卫:全面解锁小红书达人营销新玩法
  20. AtCoder Regular Contest 105 C - Camels and Bridge

热门文章

  1. sdut-1117 C语言实验——求绝对值(选择结构)
  2. set和multiset容器
  3. getTrackbarPos函数
  4. 一二三维矩阵的拼接问题
  5. Centos(阿里云) 安装python3.4以及pip3
  6. SpringCloud2.0入门3-新的eureka依赖
  7. 'Push segues can only be used when the source controller is managed by an instance of UINavigationC
  8. python 爬虫抓站
  9. UA OPTI570 量子力学1 电磁波与光子
  10. UA MATH564 概率不等式 QE练习题