iOS runloop理解

1. iOS 中有 2 API 来访问和使用 RunLoop
   A)Foundation
   NSRunLoop

 B)Core Foundation
   CFRunLoopRef
  NSRunLoop CFRunLoopRef 都代表着 RunLoop 对象
  NSRunLoop 是基于 CFRunLoopRef 的一层 OC 包装,所以要了解 RunLoop 内部结构,需要多研究 CFRunLoopRef 层面的 API Core Foundation 层面)
2.可以查看的资料

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

http://opensource.apple.com/source/CF/CF-1151.16/

3.Runloop 与线程的关系
每条线程都有唯一的一个与之对应的 RunLoop 对象
主线程的 RunLoop 已经自动创建好了,子线程的 RunLoop 需要主动创建
RunLoop 在第一次获取时创建,在线程结束时销毁
4.获得Runloop对象
   Foundation

 [NSRunLoopcurrentRunLoop];//获得当前线程的RunLoop对象

 [NSRunLoopmainRunLoop];//获得主线程的RunLoop对象

 Core Foundation

 CFRunLoopGetCurrent();//获得当前线程的RunLoop对象

 CFRunLoopGetMain();//获得主线程的RunLoop

5.

l Core Foundation 中关于 RunLoop 5 个类


CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef

6.CFRunLoopModeRef
  
CFRunLoopModeRef 代表 RunLoop 的运行模式
一个 RunLoop 包含若干个 Mode 每个 Mode 又包含若干个 Source/Timer/Observer
每次 RunLoop 启动时 ,只能指定其中一个 Mode ,这个 Mode 被称作 CurrentMode
如果需要切换 Mode ,只能退出 Loop ,再重新指定一个 Mode 进入
这样做主要是为了分隔开不同组的 Source/Timer/Observer ,让其互不影响

7. CFRunLoopModeRef

l 系统默认注册了 5 Mode:
kCFRunLoopDefaultMode App 的默认 Mode ,通常主线程是在这个 Mode 下运行
UITrackingRunLoopMode 界面跟踪 Mode ,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
UIInitializationRunLoopMode : 在刚启动 App 时第进入的第一个 Mode ,启动完成后就不再使用
GSEventReceiveRunLoopMode : 接受系统事件的内部 Mode ,通常用不到
kCFRunLoopCommonModes : 是一个占位用的 Mode ,不是一种真正的 Mode
8.
9.应用

NSTimer
ImageView 显示
PerformSelector
常驻线程
自动释放池

10.自动释放池什么时候释放?
通过observer监听runloop的状态,一旦监听到Runloop即将进入睡眠状态,就释放自动释放池(kCFRunloopBeforeWaiting)

11什么是runloop?
runloop只能选择一个Mode执行,如果当前的runloop没有任何的Source(Source0,Source1),timer,那就直接退出runloop。

12.释放池主要关注runloop的三个mode
kCFRunloopEntry  创建自动释放池
kCFRunloopWaiting 销毁自动释放池,创建一个新的自动释放池
kCFRunloopExit 销毁自动释放池。(160)
主要看Activities的值, 160 = kCFRunloopWaiting (32)+kCFRunloopExit (128)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值