Runtime 10种用法(没有比这更全的了)

阅读了多篇运行时的文章,感觉都很不错,从几篇文章里面提取一些个人认为比较重要的,偏实战的知识点的摘录,另外还结合了个人的创造形成此文。再牛逼的技术和实战结合才有意义,本篇介绍技术尽量和实战联系起来,有些没讲明白的,我给的链接里面都有,所以我就不赘述了,如果觉得可以就点个赞吧,哈哈。不需要打赏。

1)替换系统方法,

2)字典转model,

3)归档,

4)万能控制器跳转

四个偏实战的方法从不同的文章中聚合到这里.没讲明白的麻烦看客去我给的链接里面看看,他们都讲了


对文章的内容我用一张图介绍吧(图只管明了,我喜欢,大家也喜欢)

#📣appstore审核问答群:369250107,建了个仓库:,github[专门解决苹果拒绝各种问题汇总的仓库](https://github.com/wg689/Solve-App-Store-Review-Problem)

runtime 文章收集:


runtime 文章专题   (13+关于runtime的)


如下4篇内容有相似的 小白都可以看懂runtime,值得细看

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

文② 让你快速上手Runtime

文③  runtime详解

文④ 详解runtime运行时机制

文⑤ 万能控制器跳转


先用一张图对文章做一个介绍吧 (图只管,易懂方便回忆,我喜欢,大家也喜欢) 

what(runtime 是什么)

Runtime基本是用C和汇编写的,可见苹果为了动态系统的高效而作出的努力。你可以在这里下到苹果维护的开源代码。苹果和GNU各自维护一个开源的runtime版本,这两个版本之间都在努力的保持一致。Objective-C 从三种不同的层级上与 Runtime 系统进行交互,分别是通过 Objective-C 源代码通过 Foundation 框架的NSObject类定义的方法通过对 runtime 函数的直接调用大部分情况下你就只管写你的Objc代码就行,runtime 系统自动在幕后辛勤劳作着。

RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制

对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。

OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)

只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。

where(哪些地方使用runtime)

1.将某些OC代码转为运行时代码,探究底层,比如block的实现原理(上边已讲到);

2.拦截系统自带的方法调用(Swizzle 黑魔法),也可以说成对系统的方法进行替换,比如拦截imageNamed:、viewDidLoad、alloc;文/滕先洪(简书作者)  原文链接:http://www.jianshu.com/p/ab966e8a82e2

需求:比如iOS6 升级 iOS7 后需要版本适配,根据不同系统使用不同样式图片(拟物化和扁平化),如何通过不去手动一个个修改每个UIImage的imageNamed:方法就可以实现为该方法中加入版本判断语句?

步骤:

a、为UIImage建一个分类(UIImage+Category)

b、在分类中实现一个自定义方法,方法中写要在系统方法中加入的语句,比如版本判断[参考 ]

+ (UIImage*)xh_imageNamed:(NSString*)name {

doubleversion = [[UIDevicecurrentDevice].systemVersiondoubleValue];

if(version >=7.0) {

// 如果系统版本是7.0以上,使用另外一套文件名结尾是‘_os7’的扁平化图片

name = [name stringByAppendingString:@"_os7"];    }

return[UIImagexh_imageNamed:name];

}

c、分类中重写UIImage的load方法,实现方法的交换(只要能让其执行一次方法交换语句,load再合适不过了)

+ (void)load {

// 获取两个类的类方法

Method  m1 = class_getClassMethod([UIImageclass],@selector(imageNamed:));  

Method m2 = class_getClassMethod([UIImageclass],@selector(xh_imageNamed:));

// 开始交换方法实现

method_exchangeImplementations(m1, m2);

}

注意:自定义方法中最后一定要再调用一下系统的方法,让其有加载图片的功能,但是由于方法交换,系统的方法名已经变成了我们自定义的方法名(有点绕,就是用我们的名字能调用系统的方法,用系统的名字能调用我们的方法),这就实现了系统方法的拦截!

利用以上思路,我们还可以给 NSObject 添加分类,统计创建了多少个对象,给控制器添加分类,统计有创建了多少个控制器,特别是公司需求总变的时候,在一些原有控件或模块上添加一个功能,建议使用该方法!

3.实现分类也可以增加属性;

4.实现NSCoding的自动归档和自动解档;(不用对每个属性edcode和decode了,如果几十个属性一个个的encode和decode真的很麻烦啊,使用运行时可以遍历出每个对象的属性,数组的方式遍历eccode,decode)

用运行时的归档方法

不用运行时的归档方法:(还好只有5个属性,如果20个,30个或者后台突然增加了属性,这么直接写死估计代码就不灵了)

5.实现字典和模型的自动转换(核心就是可以遍历出字典中的每个属性,json解析中大牛框架都用了这个特性,包括MJEXtension,YYModel,jsonModel都是将json转换为字典,再遍历字典中的每个属性来进行modle的转换)。


MJextension 使用运行时转换的json转model的部分代码摘录

YYModel  json转model 核心代码 摘录


JsonModel json字典转model 摘录


获取属性的列表的方法是字典转模型的比较核心的方法,

OBJC_EXPORT Ivar *class_copyIvarList(Class cls, unsigned int *outCount)

__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);

致此可以下个结论吗?

基本上主流的json 转model 都少不了,使用运行时动态获取属性的属性名的方法,来进行字典转模型替换,字典转模型效率最高的(耗时最短的)的是KVC,其他的字典转模型是在KVC 的key 和Value 做处理,动态的获取json 中的key 和value ,当然转换的过程中,第三方框架需要做一些判空啊,镶嵌的逻辑处理, 再进行KVC 转模型.这句代码 [xx  setValue:value forKey:key];无论JsonModle,YYKIt,MJextension 都少不了[xx  setValue:value forKey:key];这句代码的,不信可以去搜,这是字典转模型的核心方法,


6)动态增加方法  (动态的为某个类或对象增加一个方法,摘录文章中有详细介绍)


7)动态变量控制  (动态对某个对象的变量的值进行替换,摘录文章有详细介绍)

8)实现万能控制器跳转

产品来一变态需求,推送过来的消息,要跳转到任意控制器.利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就搞定了

9)插件开发


插件入门

XCode 有个很坑爹的地方,就是它并不官方支持插件开发,官方没有文档,XCode 也没有开源,但由于 XCode 是 Objective-C 写的,OC 动态性太强大,导致在这么封闭的情况下民间还是可以做出各种插件,其核心开发方式就是:

dump 出 Xcode 所有头文件,知道 Xcode 里有哪些类和接口。

通过头文件方法名猜测方法的作用,swizzle 这些方法,插入自己的代码实现插件逻辑。

通过 NSNotificationCenter 监听各种事件的发生。

更详细的开发教程网上有不少文章,有兴趣的自行搜索吧。

10)Jspath 热更新 也是使用运行时,jspatch 基本上算是黑科技,在线修复版本bug,微信都使用了这个技术,详情百度“JSPatch”,此处省略30000字



______

- 作者开发经验总结的文章推荐,持续更新学习心得笔记

[Runtime 10种用法(没有比这更全的了)](http://www.jianshu.com/p/3182646001d1)

[成为iOS顶尖高手,你必须来这里(这里有最好的开源项目和文章)](http://www.jianshu.com/p/8dda0caf47ea)

[iOS逆向Reveal查看任意app 的界面](http://www.jianshu.com/p/060745d5ecc2)

[JSPatch (实时修复App Store bug)学习(一)](http://www.jianshu.com/p/344db07a2374)

[iOS 高级工程师是怎么进阶的(补充版20+点)](http://www.jianshu.com/p/1f2907512046)

[扩大按钮(UIButton)点击范围(随意方向扩展哦)](http://www.jianshu.com/p/ce2d3191224f)

[最简单的免证书真机调试(原创)](http://www.jianshu.com/p/c724e6282819)

[通过分析微信app,学学如何使用@2x,@3x图片](http://www.jianshu.com/p/99f1f924ae45)

[TableView之MVVM与MVC之对比](http://www.jianshu.com/p/d690b5d97201)

[使用MVVM减少控制器代码实战(减少56%)](http://www.jianshu.com/p/f85363c82ea1)

[ReactiveCocoa添加cocoapods 配置图文教程及坑总结](http://www.jianshu.com/p/66f0c7e1ced8)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 142,461评论 1 300
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,089评论 1 256
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 94,078评论 0 212
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 40,938评论 0 175
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 48,698评论 1 255
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,733评论 1 175
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,340评论 2 268
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,138评论 0 165
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 28,949评论 6 229
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,493评论 0 213
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,269评论 2 214
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,591评论 1 229
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,216评论 0 31
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,107评论 2 213
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,485评论 3 204
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,615评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,006评论 0 167
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,496评论 2 230
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,572评论 2 230

推荐阅读更多精彩内容

  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,667评论 7 64
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,373评论 25 707
  • 我在最舒适的季节,鸟语花香的春天,思索着自己到底怎么了,生活的重心哪去了,工作生活学习的动力是什么?
    圆觉经阅读 147评论 0 0
  • 自从经历过上次断舍离,不得不说,我深深地爱上了这项新的“活动”。扔了生活中的东西之后,这一次,我向陪伴了自己好多年...
    胆小的鳄鱼阅读 541评论 0 3
  • 朋友圈里原来没那么多人,现在越来越热闹了。 有些目不暇接。 之前的朋友圈是安乐窝,现在的朋友圈是大观园。 非常热闹...
    温迪画画阅读 356评论 3 3