iOS runloop理解

来源:互联网 发布:怎样联系网络推手 编辑:程序博客网 时间:2024/05/29 06:49
1.iOS中有2API来访问和使用RunLoop
   A)Foundation
   NSRunLoop

 B)CoreFoundation
   CFRunLoopRef
  NSRunLoopCFRunLoopRef都代表着RunLoop对象
  NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的APICoreFoundation层面)
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对象

 CoreFoundation

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

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

5.

lCoreFoundation中关于RunLoop5个类


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系统默认注册了5Mode:
kCFRunLoopDefaultModeApp的默认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
原创粉丝点击