1.
iOS
中有
2
套
API
来访问和使用
RunLoop
A)Foundation
NSRunLoop
B)Core
Foundation
CFRunLoopRef
NSRunLoop
和
CFRunLoopRef
都代表着
RunLoop
对象
NSRunLoop
是基于
CFRunLoopRef
的一层
OC
包装,所以要了解
RunLoop
内部结构,需要多研究
CFRunLoopRef
层面的
API
(
Core
Foundation
层面)
2.可以查看的资料
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)
2.可以查看的资料
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
7.
CFRunLoopModeRef
6.CFRunLoopModeRef
CFRunLoopModeRef
代表
RunLoop
的运行模式
一个
RunLoop
包含若干个
Mode
,
每个
Mode
又包含若干个
Source/Timer/Observer
每次
RunLoop
启动时
,只能指定其中一个
Mode
,这个
Mode
被称作
CurrentMode
如果需要切换
Mode
,只能退出
Loop
,再重新指定一个
Mode
进入
这样做主要是为了分隔开不同组的
Source/Timer/Observer
,让其互不影响
l
系统默认注册了
5
个
Mode:
kCFRunLoopDefaultMode
:
App
的默认
Mode
,通常主线程是在这个
Mode
下运行
UITrackingRunLoopMode
:
界面跟踪
Mode
,用于
ScrollView
追踪触摸滑动,保证界面滑动时不受其他
Mode
影响
UIInitializationRunLoopMode
:
在刚启动
App
时第进入的第一个
Mode
,启动完成后就不再使用
GSEventReceiveRunLoopMode
:
接受系统事件的内部
Mode
,通常用不到
kCFRunLoopCommonModes
:
这
是一个占位用的
Mode
,不是一种真正的
Mode
8.![]()
9.应用
8.
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)