美文网首页IOS知识积累
iOS Runtime 和 RunLoop

iOS Runtime 和 RunLoop

作者: 宥落 | 来源:发表于2021-01-22 17:41 被阅读0次

    文章侧重写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_msgSendobjc_msgSend_stretobjc_msgSendSuperobjc_msgSendSuper_stret

    2.2 何时使用

    实际应用中主要有以下情况:

    • 动态的给类添加成员变量和方法(category的使用,成员变量可了解objc_setAssociatedObject的使用)

    • 动态交换两个方法的实现

    • 拦截并替换方法

    • 在方法上增加额外功能

    • 实现NSCoding的自动归档和解档

    • 实现字典转模型的自动转换(如MJExtension有兴趣的可以深入了解)

    可能你觉得自己项目中,使用到的场景很少,但你的项目内肯定包含一些利用Runtime实现的第三方库,如MJExtension,当然类似的库还有很多。

    这里推荐几个个人经常使用的、利用Runtime实现的,解决我们遇到的一些问题的库,前两个个人觉得是真滴方便!

    三、最后

    如果你还有类似利用Runtime实现的好的第三方库,也可以在评论区给小弟我推荐一下,小弟我做下更新!

    相关文章

      网友评论

        本文标题:iOS Runtime 和 RunLoop

        本文链接:https://www.haomeiwen.com/subject/bhkezktx.html