1. 什么是运行循环 RunLoop
从字面上理解就是运行循环,死循环,处于一个不断运行的状态.
2. 运行循环 RunLoop 的基本作用
1)保持程序的持续运行
2)处理 App 中的各种事件(比如触摸事件,定时器事件,Selector 事件)
3)节省 CPU 资源,提高程序性能:该做事时做事,该休息时休息
.....
3. 感受运行循环的存在
// 一般的Main函数
int main(int argc, char * argv[]) {
NSLog(@"execute main function"); // 程序开始
return 0; // 程序结束
}
// 一个OC项目的Main函数
#import
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
// 我们可以接受一下返回值
int main(int argc, char * argv[]) {
@autoreleasepool {
int returnValue = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
NSLog(@"%d", returnValue);
return returnValue;
}
}
// 测试可以发现程序不会结束,也就是不会返回一个值.这是因为UIApplicationMain函数内部就启动了一个RunLoop
所以UIApplicationMain函数一直没有返回,保持了程序的持续运行
这个默认启动的RunLoop是跟主线程相关联的
4.iOS 中访问 RunLoop 的两套 API,一套是 Foundation 框架中的 NSRunLoop, 一套是 Core Foundation 框架中的 CFRunLoopRef.
NSRunLoop 和 CFRunLoopRef 都代表着 RunLoop 对象;
NSRunLoop 是基于 CFRunLoopRef 的一层 OC 包装,所以要了解 RunLoop 内部结构,需要多研究 CFRunLoopRef 层面的 API(Core Foundation 层面);
关于 RunLoop 的苹果官方文档
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
CFRunLoopRef 的开源资料
http://opensource.apple.com/source/CF/CF-1151.16/
5.RunLoop 与线程的关系
1)每条线程都有唯一的一个与之对应的 RunLoop 对象;
2)主线程的 RunLoop 已经自动创建好了,子线程的 RunLoop 需要主动创建;
3)RunLoop 在第一次获取时创建,在线程结束时销毁;
6. 两套框架中获得 RunLoop 对象的方式
//Foundation
[NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
[NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象
//Core Foundation
CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
CFRunLoopGetMain(); // 获得主线程的RunLoop对象
来源: http://www.jianshu.com/p/f2a85beb625e