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 <UIKit/UIKit.h>
#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对象