zoukankan      html  css  js  c++  java
  • 关于RunLoop

    首先我们要先认识一下这个RunLoop

    NSRunLoop是Cocoa框架中的类,与之的Core Fundation 中CFRunLoopRef类.

     CFRunLoop 核心部分,代码开源,C 语言编写,跨平台

     这两者的区别是,前者不是线程安全的,而后者是线程安全的.

    当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程。RunLoop就是控制线程生命周期并接收事件进行处理的机制。

    RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统。

    目的:

    通过RunLoop机制实现省电,流畅,响应速度快,用户体验好

    RunLoop的应用

    一般我们不需要创建或者显示启动RunLoop,有两种情况,我们需要必须手动设置它:

     在分线程中使用定时器

    定时器的实现便是基于RunLoop的,平时我们使用定时器或许没有对RunLoop做什么操作,那是因为主线程RunLoop默认是启动运行的, 如果我们在子线程中也需要重复执行某一个动作,就需要手动进行操作添加

    [[NSRunLoop currentRunLoop]run];

    runloop的运行循环模式:

    有4种模式  第一种就是默认模式: 也就是一般的方法调用使用的模式。 第二种就是跟踪模式: 用于scrollview追踪触摸滑动, 使其不受其他模式的影响, 可以共存。 第三种就是当程序启动时第一次开启的运行循环模式。第四种的话 一般开发中没听到过。没有去研究过。 其实还有一种占位模式。不过没什么太大用处。

    Runloop本质:

    其实是一个结构体。里面有obserner。nstimer。source(监听事件的)等.

    每条线程都有唯一的一个与之对应的RunLoop对象 

    主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建

    RunLoop在第一次获取时创建,在线程结束时销毁

    特性:

    主线程的RunLoop在应用启动的时候就会自动创建

    其他线程则需要在该线程下自己启动

    不能自己创建RunLoop

    RunLoop并不是线程安全的,所以需要避免在其他线程上调用当前线程的RunLoop

    RunLoop负责管理autorelease pools

    RunLoop负责处理消息事件,即输入源事件和计时器事件

    作用:

    a.保持程序的持续运行(iOS程序为什么能一直存活)

    b.处理APP中的各种事件(比如触摸事件,定时器事件NSTimer,selector事件[performSelector)

    c.节省CPU资源,提高程序性能,有事情就做事情,没事情就休息.

    如果没有RunLoop,那么程序以启动就会退出,什么事情都做不了.

    如果有了RunLoop,那么相当于在内部有了一个死循环,能够保证程序的持续运行.

    RunLoop更强大的地方在于对消息的监听,因为CFRunLoopRef的线程安全优势,我们通常会更多使用后者。

     
    输入源被注册进Runloop中时会有方法进行remove,但是定时器却没有,但是定时器中的invalidate方法可以将其从runloop中移除,正如官方文档的说明:invalidate是重要也是唯一的可以将定时器从runloop的注销的方法,所以如果我们创建了定时器,就一定要在不使用时调用invalidate方法.

  • 相关阅读:
    hdu 1047 Integer Inquiry
    大数模板(高精度)
    git 学习
    java List 排序
    简单排序总结
    JDK1.8
    webservice 学习笔记 1
    inline-block,inline,block,table-cell,float
    mybatis 学习视频总结记录
    left join right inner join 区别
  • 原文地址:https://www.cnblogs.com/xu-antong/p/6413540.html
Copyright © 2011-2022 走看看