1、RunLoop

  • 1)运行循环:

    • 运行循环在 iOS 开发中几乎不用,但是概念的理解却非常重要。

    • 同一个方法中的代码一般都在同一个运行循环中执行,运行循环监听 UI 界面的修改事件,待本次运行循环结束时,统一将界面的修改渲染出来。

    • 点击事件触发结束后立即结束本次运行循环。

    • 作用:

      • 保证程序不退出。
      • 负责监听所有事件,例如:手势触摸,时钟触发,网络加载数据完成等。
    • 特性:

      • 没有事件时,会休眠(省电),一旦监听到事件,会立即响应。
      • 每一个线程都有一个 runloop,但是只有主线程的 runloop 会默认启动。子线程的运行循环默认是不启动的。
  • 2)子线程运行循环:

    • 子线程的运行循环默认是不启动的。

    • 启动运行循环后,如果不停止运行循环,不会执行后续的任何代码,会形成一个死循环。

    • 一旦停止了运行循环,后续代码能够执行,执行完毕后,线程被自动销毁。

  • 3)响应者链条事件监听过程:

2、运行循环的使用

2.1 时钟调度

	/*
- (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode; NSDefaultRunLoopMode: 时钟,网络。 发生用户交互的时候,时钟会被暂停
NSRunLoopCommonModes: 用户交互,响应级别高。 发生用户交互的时候,时钟仍然会触发,如果时钟触发方法非常耗时,
使用此方式时用户操作会造成非常严重的卡顿。
*/
  • 以 NSRunLoopCommonModes 方式创建

    	// 调度时钟
    self.timer = [NSTimer timerWithTimeInterval:1.0
    target:self
    selector:@selector(updateTimer)
    userInfo:nil
    repeats:YES]; // 将时钟以 NSRunLoopCommonModes 模式添加到运行循环
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
  • 以 NSDefaultRunLoopMode 方式创建

    	// 调度时钟
    /*
    默认将时钟以 NSDefaultRunLoopMode 模式添加到运行循环
    */
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0
    target:self
    selector:@selector(updateTimer)
    userInfo:nil
    repeats:YES];
  • 子线程运行循环

    	dispatch_async(dispatch_get_global_queue(0, 0), ^{
    
    		// 在子线程开启时钟,由于子线程的运行循环没有启动,所以没法监听时钟事件
    self.timer = [NSTimer timerWithTimeInterval:1.0
    target:self
    selector:@selector(updateTimer)
    userInfo:nil
    repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode]; // 启动子线程的运行循环,这句代码就是一个死循环!如果不停止运行循环,不会执行后续的任何代码
    CFRunLoopRun(); // 停止子线程运行循环之前,不会执行添加到此处的任何代码
    }); // 运行循环执行操作方法
    - (void)updateTimer { static int num = 0; NSLog(@"%d %@", num++, [NSThread currentThread]); // 满足条件后,停止当前的运行循环
    if (num == 8) { // 一旦停止了运行循环,后续代码能够执行,执行完毕后,线程被自动销毁
    CFRunLoopStop(CFRunLoopGetCurrent());
    }
    }

iOS - OC RunLoop 运行循环/消息循环的更多相关文章

  1. iOS - OC 使用运行时来获取并修改类

    前言:          Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表.属性列表.变量列表,修改方法.属性,增加方法,属性等等,本文对相 ...

  2. Chromium on Android: Android在系统Chromium为了实现主消息循环分析

    总结:刚开始接触一个Chromium on Android时间.很好奇Chromium主消息循环是如何整合Android应用. 为Android计划,一旦启动,主线程将具有Java消息层循环处理系统事 ...

  3. iOS Runloop 消息循环

    介绍 Runloop是一种事件监听循环,可以理解成一个while死循环,监听到事件就起来,没有就休息. Runloop可以在不同模式下进行切换,iOS有五种模式,其中UIInitializationR ...

  4. ios - 图片自动轮播定时器(NSTimer)以及消息循环模式简介

    本文只是演示如何设置图片轮播的定时器. 创建全局变量NSTimer 程序启动后就开始轮播图片,所以在- (void)viewDidLoad中就启动定时器. 将定时器放入消息循环池中.- (void)v ...

  5. 什么是消息循环,一个简单的win32程序如何运行?

    预备知识 1.什么是句柄? (HANDLE) 在win32编程中有各种句柄,那么什么是句柄呢? #define DECLARE_HANDLE(name) struct name##_ { int un ...

  6. Android Handler 消息循环机制

    前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定 ...

  7. Android的消息循环机制 Looper Handler类分析

    Android的消息循环机制 Looper Handler类分析 Looper类说明   Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在ru ...

  8. QObject::deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象 good

    程序编译运行过程很顺利,测试的时候也没发现什么问题.但后来我随手上传了一个1G大小的文件,发现每次文件上传到70%左右的时候程序就崩溃了,小文件就没这个问题.急忙打开任务管理器,这才发现上传文件的时候 ...

  9. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

随机推荐

  1. TreeView htc 改写

    call the function loadTree(treeviewId) when body is loaded <body onload="loadTree('tvSelect' ...

  2. tomcat清除缓存

    方案一:点击进入解压后的tomcat,找到work文件夹,.此文件下有个catalina目录(tomcat小名叫catalina),work目录下的文件都可以删除.如果我们先前发布的一个项目有错,大家 ...

  3. [ios]纯代码实现UITableViewCell的自定义扩展

    (转)参考:http://blog.sina.com.cn/s/blog_65cbfb2b0101cd60.html 第一种, 简单的增加UITableViewCell一些小功能 例如在cell上面添 ...

  4. Android网络连接之HttpURLConnection和HttpClient

    1.概念   HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.在 JDK 的 java.net 包中 ...

  5. C++内存分析

    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数 ...

  6. office软件

    32位系统office2013: http://pan.baidu.com/s/1bnCqMZ1 64位系统office2013: http://pan.baidu.com/s/1i33rdHF vi ...

  7. centos6.5版本改系统语言成中文简体

    root:locale -a 查看系统支持的语言,如果看到这个zh_CN.utf8(这是中文简体)说明系统支持此语言 root:vim /etc/sysconfig/i18n(编辑语言的配置文件) 输 ...

  8. C#中汉诺塔问题的递归解法

    百度测试部2015年10月份的面试题之——汉诺塔. 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔. 百度百科在此. 游戏试玩在此. 用递归的思想解决汉诺塔问题就是分 ...

  9. hdu 2258 优先队列

    Continuous Same Game (1) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  10. 【Linux】vi(vim)起步学起来有些困难,一步一步温习

    以Tomcat的配置文件service.xml为例,记录.学习vi的最常用操作. > 什么是vi or vim? [nicchagil@localhost bak]$ man vi VIM() ...