美文网首页
iOS RunLoop 总结

iOS RunLoop 总结

作者: 含笑州 | 来源:发表于2019-03-06 09:12 被阅读0次

    1.什么是RunLoop?

    从字面意思看就是运行循环,其实内部就是do-while循环,这个循环内部不断地处理各种任务(比 如Source,Timer,Observer)

    一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(run方法)

    RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source,Timer,Observer,那么就直接退出RunLoop 

    2.Runloop和线程是什么关系?

    每条线程都有唯一的一个与之对应的RunLoop对象;主线程的RunLoop已经自动创建,子线程的RunLoop需要主动创建;RunLoop在第一次获取时创建,在线程结束时销毁

    3.Runloop的mode作用是什么?

    指定事件在运行循环中的优先级的,

    线程的运行需要不同的模式,去响应各种不同的事件,去处理不同情境模式。(比如可以优化tableview的时候可以设置UITrackingRunLoopMode下不进行一些操作,比如设置图片等。)

    以+scheduledTimerWithTimeInterval:的方式触发的timer,在滑动页面上的列表时,timer会暂停回调, 为什么?

    滑动scrollView时,主线程的RunLoop会切换到UITrackingRunLoopMode这个Mode,执行的也是UITrackingRunLoopMode下的任务(Mode中的item),而timer是添加在NSDefaultRunLoopMode下的,所以timer任务并不会执行,只有当UITrackingRunLoopMode的任务执行完毕,runloop切换到NSDefaultRunLoopMode后,才会继续执行timer。

    如何解决在滑动页面上的列表时,timer会暂停回调?

    将Timer放到NSRunLoopCommonModes中执行即可

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

    [[NSRunLoop currentRunLoop] run];

    4.你在开发过程中怎么使用RunLoop?什么应用场景?

    开启一个常驻线程(让一个子线程不进入消亡状态,等待其他线程发来的消息,处理其他事件)

    在子线程中开启一个定时器

    在子线程中进行一些长期监控

    可以控制定时器在特定模式下运行

    可以让某些事件(行为,任务)在特定模式下执行

    可以添加observer监听RunLoop的状态,比如监听点击事件的处理(比如在所有点击事件前做一些处理)

    5.自动释放池什么时候释放

    在RunLoop睡眠之前释放(kCFRunLoopBeforeWaiting)

    AutoreleasePool

    应用程序一旦启动,主线程 RunLoop 里注册了两个 Observer。一个 Observer 监听即将进入Loop事件,回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池,并保证创建释放池发生在其他所有回调之前。另外一个 Observer 监视了两个事件(RunLoop即将进入休眠和即将退出 RunLoop 事件) ,前者会调用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 释放旧的池并创建新池;后者会调用 _objc_autoreleasePoolPop() 来释放自动释放池,并保证释放自动释放池事件发生在其它回调之后。

    相关文章

      网友评论

          本文标题:iOS RunLoop 总结

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