什么是runtime?

runtime是一套纯c的API.平时用oc写的代码在运行时都会先转成runtime代码,然后在执行。

runtime可以干什么?

1.交换方法。(method_exchangeImplementations)

首先创建一个People类,有俩个类方法,+(void)run{NSLog@"跑"}和+(void)sing{NSLog@"唱歌"}.

依次调用这两个方法,控制台会依次输出 跑 和 唱歌 。

用runtime获取到People类的run方法。

Method m1=class_getClassMethod([People class], @selector(run)) ;

同理获取sing方法。

Method m2=class_getClassMethod([People class], @selector(sing)) ;

交换两个方法。

method_exchangeImplementations(m1, m2) ;

在依次调用这个两个方法,控制台会输出 唱歌 和 跑。

实例方法用 class_getInstanceMethod 来获取。

2.在分类中设置属性。

众所周知,在分类中是无法添加实例变量的。就算在分类中声明了一个属性,也只是生成了这个属性的set方法和get方法,并不会生成这个属性。并且,虽然打点调用会有

提示,但是一旦运行程序就会崩溃。所以要想在分类中添加实例变量还得使用runtime来操作。

使用到的是

  void objc_setAssociatedObject(id object , const void *key ,id value ,objc_AssociationPolicy policy) 这个方法。

其中:

object就是你想要添加属性的对象。

key则是你想保存的属性的键。

value则是你想保存的属性的值。

policy则是你想保存的属性的属性(assign,copy之类的)。

比如在一个分类中声明了一个属性。

@property(nonatomic,copy)NSString* name

在其set方法中这么调用:

char nameKey ;//声明属性的键。

-(void)setName:(NSString *)name

{

objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC) ;//关联 键和值

}

在其get方法中这么调用来获取这个属性:

-(NSString* )name

{

return objc_getAssociatedObject(self, &nameKey) ;

}

这样就在分类中添加了一个属性。

3.获取一个类的所有属性。

-(void)getPropertyFromPeople

{

unsigned int outcount ;

Ivar* ivars=class_copyIvarList([People class],&outcount) ;//会返回属性的个数,outcount即为总个数

for(int i=0;i<outcount;i++)

{

Ivar ivar=ivars[i] ;

const char* name=ivar_getName(ivar) ;

const char* type=ivar_getTypeEncoding(ivar) ;

NSLog(@"属性名称%s 类型%s",name,type) ;

}

free(ivars) ;//注意释放内存

}

4.将dict转换成model类。

将方法写在NSObject的分类中,然后model类继承于NSObject,在导入分类的头文件。

-(instancetype)modelWithDictionary:(NSDictionary* )dict

{

Class modelClass=self.class ;

while (modelClass&&modelClass!=[NSObject class]) {

unsigned int count=0 ;

Ivar* ivars=class_copyIvarList(modelClass, &count) ;

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

Ivar ivar=ivars[i] ;

NSString* key=[NSString stringWithUTF8String:ivar_getName(ivar)] ;

key=[key substringFromIndex:1] ;

id value=dict[key] ;

if (value==nil) {

continue ;

}

NSString* type=[NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)] ;

//type的格式为@“@\“NSString\””

NSRange range=[type rangeOfString:@"@"] ;

if (range.location!=NSNotFound) {

if (![type containsString:@"NS"]) {

//是自定义的类型

Class another=NSClassFromString([type substringWithRange:NSMakeRange(2, type.length-3)]) ;

value=[another secondModelWithDictionary:value] ;

}else if([[type substringWithRange:NSMakeRange(2, type.length-3)] isEqualToString:@"NSArray"])

{

//包含数组

//包含model数据的数组

NSArray* array=(NSArray* )value ;

NSMutableArray* modelArr=[NSMutableArray array] ;

//用于接收数组中model的类型

id class ;

if ([self respondsToSelector:@selector(classStringByArray)]) {

class=[self classStringByArray] ;

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

//将数组的数据转换成model添加到临时数组中

[modelArr addObject:[class secondModelWithDictionary:array[i]]] ;

}

value=modelArr ;

}

}

}

[self setValue:value forKey:key] ;

}

free(ivars) ;

modelClass=[modelClass superclass] ;

}

return self ;

}

+(instancetype)secondModelWithDictionary:(NSDictionary* )dict

{

NSObject* object=[[self alloc]init] ;

[object modelWithDictionary:dict] ;

return object ;

}

转载于:https://www.cnblogs.com/zhoujieBlog/p/5731077.html

Runtime初学习相关推荐

  1. 消息队列(Message Query)的初学习

    消息队列(Message Query)的初学习   摘要:本篇笔记主要记录了对于消息队列概念的初次学习.消息队列的基础知识. 文章目录 消息队列(Message Query)的初学习 1.何为消息? ...

  2. Python初学习--你的历史我想知道一下

    简述 Linux是一套自由加开放源代码的类Unix操作系统,诞生于1991年10月5日(第一次正式向外公布),由芬兰学生Linus Torvalds和后来陆续加入的众多爱好者共同开发完成. Linux ...

  3. .Net Core MVC初学习

    .net core已经出来很长一段时间了,没有很好的学习过,现在工作不那么忙了,参考官方文档,在这里记录自己的学习过程! ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且连接 ...

  4. asp.net初学习实现简单的增删改查功能

    在学习中发现网页模板可以大大节约重复的页面代码,同时对于WebSite开发的程序在不同的页面直接调用已写好的代码既不方面,只是作为代码量不大的程序进行开发还是比较方便. get和post的区别get是 ...

  5. L4Re Runtime Environment 学习资料

    官网地址 官网地址 : L4Re Runtime Environment Microkernel Construction Microkernel Construction 地址 Studium/Mk ...

  6. 初学习C语言的小Tip

    初学C语言的朋友应该首先了解C语言关键的核心概念(结构化.三个执行流程.优先级.指针.文件.共用体.函数.作用域.重载等 ),只有弄明白了这些才能在今后的学习中游刃有余的把握C语言的精髓.这几个概念就 ...

  7. golang runtime.Caller 学习笔记

    runtime.Caller runtime.Caller可以获取到调用时的代码文件路径.行数等信息,在打印日志时常常使用 runtime.Caller源码 // Caller reports fil ...

  8. vipkid和vipjr比较,哪个更适合小升初学习?

    我儿子今年9月,就得上初中了.而我们希望读的那个好学校,在市里是前三的,它还有入学试和面试,我儿子成绩其实,还挺好的,最头疼的是面试还有英文介绍部分. 读公立小学,英语老师都是乡土风发音的,而且最大的 ...

  9. Android初学习之四:知晓当前是哪一个活动和随时随地退出程序

    一.知晓当前是哪一个活动 1.首先新建两个活动FirstActivity和ScondActivity 2.接着在新建一个java class为BaseActivity 3.最后让刚刚两个活动继承Bas ...

最新文章

  1. 管道:实用程序服务和数据结构
  2. Learning to Learn:图神经网络上的元学习
  3. 数据库面试要点:关于MySQL数据库千万级数据查询和存储
  4. 关于选择,说一个同学的真实故事
  5. Node.js nrm
  6. python在webservice接口测试中的应用
  7. (4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试
  8. android 单手模式开发,单手操作毫无压力 安卓单指缩放技巧
  9. 小米盒子 smb Android,客厅里的多媒体 小米盒子SMB本地连接
  10. 查看oracle磁盘组空间,shell脚本检查oracle中的ASM磁盘组空间并发送邮件
  11. 如何赋能传统制造业数字化转型升级?
  12. Codeforces - Mike and Feet
  13. 全球与中国量身定制生产线市场深度研究分析报告
  14. Logo设计没灵感?这7个宝藏网站拯救你的头发
  15. 宁波初级职称证书查询
  16. 勒索病毒SARA,请勿用于非法用途。
  17. JMeter-01-性能测试基础知识介绍
  18. 字符串匹配/模糊匹配(查找/模糊查找)的算法
  19. Arduino 开发ESP8266(ESP12F)模块
  20. magento系统自带批量小结

热门文章

  1. 听说有人解决了三体问题,我去做了一点微小的调查
  2. 李飞飞团队给机器人造了一个“模拟厨房”:洗切炒菜一条龙训练!人类还能VR监管 | 开源...
  3. 火星无人机同款技术全部公开!高通还特意给Plus了一下
  4. 如何筑起第二座“长城”?长城汽车:唯有科技
  5. 专访英特尔戴金权 | AI和大数据正在这样重塑英特尔
  6. 上班4年“武功”全废,想跳槽却被HR嘲讽,这位搞AI的硕士小哥心态崩了
  7. 腾讯AI单挑碾压王者荣耀职业玩家:人类15场只能赢1局,坚持不到8分钟 | “绝悟”技术细节披露...
  8. CSS 同级元素浮动分析小结
  9. django中聚合aggregate和annotate GROUP BY的使用方法
  10. 计算机操作原理进程调度算法---先来先服务,短进程优先(C语言)