RunLoop基本功能
- 1.保持程序的持续运行
- 2.处理App的各种事件(比如触摸事件,定时器事件)
- 3.节省CPU资源,提高程序性能,该做事时做事,该休息时候休息
1.保持程序的持续运行,比如iOS中,如果没有RunLoop,程序一启动执行完main函数就会挂掉
int main(int argc, char * argv[]) {
@autoreleasepool {
// RunLoop
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
3.节省CPU资源,提高程序性能,该做事时做事,该休息时候休息 如果App不处理任何事件,比如只是打开了App,不点击任何按钮,不拖动视图等操作,RunLoop就会让App进入休眠状态
RunLoop对象
iOS中又2套API来访问和使用RunLoop
Foundation : NSRunLoop
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
Core Foundation : CFRunLoopRef
CFRunLoopRef runloop2 = CFRunLoopGetCurrent();
NSRunLoop
和CFRunLoopRef
都代表着RunLoop
对象
NSRunLoop
是基于CFRunLoopRef
的一层Objective-C
包装
RunLoop与线程
- 每条线程都有唯一的一个与之对应的RunLoop对象
- RunLoop保存在一个全局的Dictionary里,线程作为key,
RunLoop
作为value - 线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建
- RunLoop会在线程结束时候销毁
- 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop
打印函数调用栈lldb指令bt
,就可以查看省略掉的函数
self.view.backgroundColor = [UIColor redColor];
代码执行到这行,并不是马上刷新界面,而是要等到RunLoop的observer的监听到要beforeWaiting即将睡眠之前进行UI的刷新