美文网首页
浅谈Runloop与线程关系

浅谈Runloop与线程关系

作者: TonyTT | 来源:发表于2021-04-22 10:44 被阅读0次

 废话:很久没有写东西了,以前写的东西觉得不太严谨还删除了一些文章,以免给大家误导。写这个文章原因是因为我在面试的时候遇到的一个问题,理解了一些就想分享出来。

正经:当时的问题是在并发异步的多线程执行任务,[self performSelector:@selector(print) withObject:nil afterDelay:0];这个方法会不会执行print,觉得码字可能说不清楚,还是贴代码如图1

图1

这段代码的打印的顺序应该是什么呢?很多朋友应该都知道,没错是 3  1如图2。至于为什么先打3后打1 不知道的朋友可以看看GCD并发队列和异步函数的使用问题,并不会打印2。这个原因是因为我们使用的并发加异步的方式会开启子线程,而[self performSelector:@selector(print) withObject:nil afterDelay:0];是底层runloop的添加timer方式,又因为子线程的runloop默认是没有开启的,所有并不会执行print方法。

.图2

到这里该有朋友问了那如何才能走print方法,其实我们只要把[self performSelector:@selector(print) withObject:nil afterDelay:0];方法的 afterDelay去掉就能执行print,废话不多说,代码跑一遍。看图3。

图3

这是因为去掉afterDelay的方法就变成了NSObject消息发送机制了,跟我们平时调用方法一样,会被直接调用。

那有人会问了,你这是改动了方法之后才起到效果的,如果在不改[self performSelector:@selector(print) withObject:nil afterDelay:0];的方法情况下,如何执行print呢?其实也是有方法的,上面我也说到了,其实是因为这个方法是runloop的添加timer,那既然是因为没有开启runloop,那我们开启不就好了。

图4

跑一下看看:图5

图5

居然没有打印2?为什么呢?我不是启动了runloop了吗? 带着疑惑我打印了下runloop。图6

图6

 我发现runloop的source0 source1 observers 以及timers全都是null,那就知道为什么了, 其实只是我们开启runloop的地方错了,需要放到[self performSelector:@selector(print) withObject:nil afterDelay:0]之后去开启,这样才有timers,如下两图

图7 图8

现在就有了timer,所以print也就正常打印了,如图9

图9

结语:希望对这些还不明白的同学有所帮助。每天学习一点 进步一点 学无止境,还有很多的知识没有掌握,需要我们自己不断的去探索学习。加油,所有iOSer!!!

相关文章

  • 浅谈Runloop与线程关系

    废话:很久没有写东西了,以前写的东西觉得不太严谨还删除了一些文章,以免给大家误导。写这个文章原因是因为我在面试的时...

  • runloop

    runloop是什么 runloop与线程有什么关系 runloop的原理 runloop的使用

  • Autorelease 对象的内存管理

    AutoreleasePool 与Runloop 关系 主线程默认会开启Runloop, Runloop 会自动帮...

  • RunLoop与线程

    RunLoop与线程之间的关系 每条线程都有唯一一个与之对应的RunLoop对象主线程的RunLoop已经自动创建...

  • 深入理解Runloop

    RunLoop 的概念 RunLoop 与线程的关系 RunLoop 对外的接口 RunLoop 的 Mode R...

  • 深入理解RunLoop

    转载:ibireme RunLoop 与线程的关系 RunLoop 对外的接口 RunLoop 的 Mode Ru...

  • RunLoop

    一、获取RunLoop 二、RunLoop与线程关系1、每条线程都有唯一的一个与之对应的RunLoop对象2、Ru...

  • iOS底层原理——浅谈RunLoop

    RunLoop应用:线程保活 线程保活、控制销毁 iOS-浅谈RunLoop8iOS底层原理总结 - RunLoo...

  • RunLoop介绍

    RunLoop 的概念 RunLoop 与线程的关系 RunLoop核心数据结构 CFRunLoopRef CFR...

  • iOS面试题-RunLoop

    1. RunLoop和线程的关系 每条线程都有唯一的一个RunLoop对象与之对应的 主线程的RunLoop是自动...

网友评论

      本文标题:浅谈Runloop与线程关系

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