-
每一个程序入口的mian函数就有一个RunLoop。
UIApplicationMain函数内部启动的一个RunLoo,所以UIApplicationMain函数一直没有返回,这样就保持了程序的持续运行(这个RunLoop是相关联主线程的)
代码:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegate class]));
}
}
什么是RunLoop
- 运行循环
- 基本作用:
1.保持程序的持续运行,如果没有RunLoop,程序执行完main函数就结束了。
2.处理App中的各种事件(比如触摸事件、定时器事件、Selector事件)
3.节省CPU资源,提高程序性能:该做事时做事,该休息时休息
RunLoop与线程间的关系
1.每一个RunLoop对象都有一个线程和它唯一对应。
2.主线程的RunLoop是自动创建的,子线程的RunLoop需要主动创建。
3.RunLoop是在第一次获取的时候创建,并在线程结束时自动销毁。
iOS中有2个API可以提供访问和使用RunLoop
- Foundation : NSRunLoop
[NSRunLoop currentRunLoop];// 获得当前线程的RunLoop对象
[NSRunLoop mainRunLoop];// 获得主线程的RunLoop对象 - CoreFoundation : CFRunLoopRef
CFRunLoopGetCurrent();// 获得当前线程的RunLoop对象
CFRunLoopGetMain();// 获得主线程的RunLoop对象
RunLoop相关类
- CFRunLoopRef
- CFRunLoopModeRef
- CFRunLoopSourceRef
- CFRunLoopTimerRef
- CFRunLoopObserverRef
1.CFRunLoopModeRef
- CFRunLoopModeRef代表RunLoop的运行模式
- 一个 RunLoop包含若干个 Mode,每个Mode又包含若干个 Source/Timer/Observer
- 每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称 作 CurrentMode
- 如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入,这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响
2.CFRunLoopTimerRef
- CFRunLoopTimerRef是基于时间的触发器
- CFRunLoopTimerRef基本上说的就是NSTimer,它受RunLoop的Mode影响
3.CFRunLoopSourceRef
- CFRunLoopSourceRef是事件源(输入源)
4.CFRunLoopObserverRef
- CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变
添加观察者的代码:
//创建observer
CFRunLoopObserverRefobserver = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),kCFRunLoopAllActivities,YES,0,^(CFRunLoopObserverRefobserver, CFRunLoopActivityactivity) {
NSLog(@"----监听到RunLoop状态发生改变---%zd",activity);
});
//添加观察者:监听RunLoop的状态
CFRunLoopAddObserver(CFRunLoopGetCurrent(),observer, kCFRunLoopDefaultMode);
//释放Observer
CFRelease(observer);