OC最实用的runtime总结,面试、工作你看我就足够了!.docxVIP

 OC最实用的runtime总结,面试、工作你看我就足够了!.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OC最实用的runtime总结,面试、工作你看我就足够了!前言runtime的资料网上有很多了,部分有些晦涩难懂,我通过自己的学习方法总结一遍,主要讲一些常用的方法功能,以实用为主,我觉得用到印象才是最深刻的,并且最后两个demo也是MJExtension的实现原理,面试的时候也可以多扯点。另外runtime的知识还有很多,想要了解更多可以看我翻译的/p/158c5d118937 \t /p/_blank官方文档(有点枯燥),本文的demo/XHTeng/XHRuntimeDemo \t /p/_blank下载地址什么是runtime?runtime 是 OC底层的一套C语言的API(引入 objc/runtime.h 或objc/message.h),编译器最终都会将OC代码转化为运行时代码,通过终端命令编译.m 文件:clang -rewrite-objc xxx.m可以看到编译后的xxx.cpp(C++文件)。比如我们创建了一个对象 [[NSObject alloc]init],最终被转换为几万行代码,截取最关键的一句可以看到底层是通过runtime创建的对象.cpp 文件删除掉一些强制转换语句,可以看到调用方法本质就是发消息,[[NSObject alloc]init]语句发了两次消息,第一次发了alloc 消息,第二次发送init 消息。利用这个功能我们可以探究底层,比如block的实现原理。需要注意的是,使用objc_msgSend() sel_registerName()方法需要导入头文件objc/message.h消息机制另外利用runtime 可以做一些OC不容易实现的功能动态交换两个方法的实现(特别是交换系统自带的方法)动态添加对象的成员变量和成员方法获得某个类的所有成员方法、所有成员变量如何应用运行时?1.将某些OC代码转为运行时代码,探究底层,比如block的实现原理(上边已讲到);2.拦截系统自带的方法调用(Swizzle 黑魔法),比如拦截imageNamed:、viewDidLoad、alloc;3.实现分类也可以增加属性;4.实现NSCoding的自动归档和自动解档;5.实现字典和模型的自动转换。下面我通过demo 我一个个来讲解一、交换两个方法的实现,拦截系统自带的方法调用功能需要用到的方法 objc/runtime.h获得某个类的类方法Method class_getClassMethod(Class cls , SEL name)获得某个类的实例对象方法Method class_getInstanceMethod(Class cls , SEL name)交换两个方法的实现void method_exchangeImplementations(Method m1 , Method m2)案例1:方法简单的交换创建一个Person类,类中实现以下两个类方法,并在.h 文件中声明+ (void)run { NSLog(@跑);}+ (void)study { NSLog(@学习);}控制器中调用,则先打印跑,后打印学习[Person run];[Person study];下面通过runtime 实现方法交换,类方法用class_getClassMethod ,对象方法用class_getInstanceMethod// 获取两个类的类方法Method m1 = class_getClassMethod([Person class], @selector(run));Method m2 = class_getClassMethod([Person class], @selector(study));// 开始交换方法实现method_exchangeImplementations(m1, m2);// 交换后,先打印学习,再打印跑![Person run];[Person study];案例2:拦截系统方法需求:比如iOS6 升级 iOS7 后需要版本适配,根据不同系统使用不同样式图片(拟物化和扁平化),如何通过不去手动一个个修改每个UIImage的imageNamed:方法就可以实现为该方法中加入版本判断语句?步骤:1、为UIImage建一个分类(UIImage+Category)2、在分类中实现一个自定义方法,方法中写要在系统方法中加入的语句,比如版本判断+ (UIImage *)xh_imageNamed:(NSString *)name { double version = [[UIDevice currentDevice].systemVersion doubleValue]; if (version = 7.0) { // 如果系统版本是7.0以上,使用另外一套文件名结尾是‘_os

文档评论(0)

mushi + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档