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

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

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

RunLoop的应用

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

在分线程中使用定时器

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

[[NSRunLoop currentRunLoop]run];

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

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

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

作用:

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

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

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

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

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

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

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

最新文章

  1. gcc 版本降级
  2. Linux复制指定目录及子目录下特定类型的文件
  3. WCf的理解
  4. 【转】c#文件操作大全(一)
  5. 【HDOJ】1818 It's not a Bug, It's a Feature!
  6. <转>Java的一些历史
  7. pseudocode of zigzag conversion
  8. new Image的API
  9. javascript 中的apply()和call()方法详解
  10. C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
  11. Python爬虫学习之正则表达式爬取个人博客
  12. 安装Linux系统
  13. python基础 ---- 使用pyCharm 调试
  14. 这可能由 CredSSP 加密 oracle 修正引起的。
  15. Mysql索引分类和索引优化
  16. BZOJ2671 Calc 【莫比乌斯反演】
  17. js 中 this 的指向问题
  18. day04.3-生成器
  19. 交叉编译移植openssl
  20. Node.js 调用 restful webservice

热门文章

  1. struts配置文件和国际化
  2. Linux_System11
  3. UVa 10427 - Naughty Sleepy Boys
  4. 我对CSS中的BFC的理解
  5. 第六百二十七天 how can I 坚持
  6. Java经典案例之-判断质数(素数)
  7. 部署statspack工具(一)
  8. C#多线程-volatile、lock关键字
  9. 锁 和 CopyOnWrite的实现
  10. JS日期时间加减实现