iOS Runtime 和 RunLoop
文章侧重写Runtime
,因为Runtime
偏应用多一些,在实际使用中用到的场景较多,开发中可以帮我我们解决大量的问题。RunLoop
仅供了解,个人使用也不多。
之前总有一种疑惑,为什么去面试的时候,面试官总是问runloop和runtime?(之前对他们的使用不多)。后来用到的地方多了(主要指runtime的使用),也面试了很多来应聘的,个人觉得runloop你可以只处于理论阶段,但对于runtime你不应该还处于理论阶段,它真的能做很多的事情,即使自己不开发,也应该多学习一些好的代码库,多看一些别人写的。最后,面试官问你runtime,真不是故意为难你!!!
一、RunLoop
1.1 简介
运行循环
的意思,具体查看RunLoop官方文档,主要作用就是保证线程不退出能随时处理事件,实现了线程有工作时忙,没工作时线程进入睡眠,避免资源浪费的目的。
1.2 何时使用
按官方文档介绍,在以下情况就需要启动RunLoop:
-
使用端口或自定义输入源与其他线程进行通信
-
在线程上使用
计时器
(常见,基本每个项目都会有使用)。 -
在程序内任何使用performSelector...的方法
-
保持线程执行定期任务
后三种情况在开发中多少都会遇到、使用过,第一种情况的具体使用可以查看官方文档。
个人了解也不是很多,只是突然间想了解一下,项目中使用最多的地方还是计时器,也只有这一种情况,如:
- (NSTimer *)timer{
if(!_timer){
_timer =[NSTimer timerWithTimeInterval:1 target:self selector:@selector(notityCurrentTimer) userInfo:nil repeats:YES];
[_timer setFireDate:[NSDate distantFuture]];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
}
return _timer;
}
除此还需要了解下线程和runloop的关系(每个线程都有一个runloop,主线程的runloop默认开启,子线程runloop需要手动开启关闭),关于RunLoop的更多介绍可查看RunLoop详解
二、Runtime
2.1 简介
简称运行时
,就是系统在运行的时候的一些机制,最主要的是消息机制。意味着它可以动态创建类和对象
,进行消息发送和转发
等操作。
这里提到消息机制(和消息推送机制
要区分开),建议在了解和使用Runtime之前,先了解一下iOS的消息机制,这样有助于学习和了解Runtime。简单地提一下,有兴趣的可以多看看别的资料,这里对一些关键方法名大致过一眼,比如objc_msgSend
、objc_msgSend_stret
、objc_msgSendSuper
、objc_msgSendSuper_stret
、
2.2 何时使用
实际应用中主要有以下情况:
-
动态的给类添加成员变量和方法(
category
的使用,成员变量可了解objc_setAssociatedObject
的使用) -
动态交换两个方法的实现
-
拦截并替换方法
-
在方法上增加额外功能
-
实现NSCoding的自动归档和解档
-
实现字典转模型的自动转换(如
MJExtension
有兴趣的可以深入了解)
可能你觉得自己项目中,使用到的场景很少,但你的项目内肯定包含一些利用Runtime实现的第三方库,如MJExtension
,当然类似的库还有很多。
这里推荐几个个人经常使用的、利用Runtime实现的,解决我们遇到的一些问题的库,前两个个人觉得是真滴方便!
-
AvoidCrash防止崩溃,如字典、数组越界等引起的crash
-
UINavigation-SXFixSpace 解决导航栏按钮位置偏移,这个还蛮方便的
-
JSPatch热更新
三、最后
如果你还有类似利用Runtime
实现的好的第三方库,也可以在评论区给小弟我推荐一下,小弟我做下更新!