/*
RunLoop 作用:
*保证程序持续运行
*处理App中的各种事件 (触摸 定时器 selector)
*如果没人让App处理事件 RunLoop会进入休眠状态
*节省CPU资源 提高程序性能. 该做事情的时候做事, 该休息的时候休息
*/
/*
RunLoop 在 iOS中有两套API
*Foundation
NSRunLoop
*Core Foundation 大部分东西 都是C语言的
NSRunLoop 封装了CFRunLoopRef
*
*/
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor grayColor];
/*
RunLoop与线程的关系:
每个线程都有一个与之对应的RunLoop
主线程的RunLoop在程序启动是 自动创建
子线程则需要你自己手动创建
*/
//1.获取RunLoop (准确的说,是获取当前线程的RunLoop)
[NSRunLoop currentRunLoop];
//获取主线程的RunLoop
[NSRunLoop mainRunLoop];
//子线程的RunLoop(这是需要我们自己创建的)默认情况下NSTimer被加入NSDefalutRunLoopMode
// 如果想NSTimer受到组件或者动画影响 添加到NSRunLoopCommonModes(OC代码如下:)
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadAction) object:nil];
[thread start];
//2.mode 代表运行模式
/*
*RunLoop是有多个模式的,但是一个RunLoop只能选择一种模式运行, 如果想要切换模式,需要退出当前模式
*如果选择一个模式执行, 则只能运行当前模式下的事件
*/
/*
kCFRunLoopDefaultMode 默认模式 主线程默认的模式
UITrackingRunLoopMode 界面跟踪模式 ScrollView滑动时走的模式
kCFRunLoopCommonModes 占位模式 (包含上面两种模式,若把事件添加到此模式下,事件在上面两种模式都可以响应)
*/
[self timerAction];
[self observer];
}
- (void)threadAction{
//懒加载 创建RunLoop
// NSLog(@"%@",[NSRunLoop currentRunLoop]);
}
- (void)timerAction{
// [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timerEvent:) userInfo:nil repeats:YES];
NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(timerEvent:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode]; //UITrackingRunLoopMode界面跟踪模式 ScrollView滑动时走的模式 ??哈哈试一试
/*
NSDefaultRunLoopMode 默认模式 主线程默认的模式
UITrackingRunLoopMode 界面跟踪模式 ScrollView滑动时走的模式
NSRunLoopCommonModes 占位模式 (包含上面两种模式,若把事件添加到此模式下,事件在上面两种模式都可以响应)
*/
}
- (void)timerEvent:(NSTimer *)sender{
NSLog(@"timer ??");
}
- (void)observer{
// CFRunLoopObserverRef 是观察者 监听RunLoop的状态
/*
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), 即将进入RunLoop
kCFRunLoopBeforeTimers = (1UL << 1),
kCFRunLoopBeforeSources = (1UL << 2),
kCFRunLoopBeforeWaiting = (1UL << 5), 休眠之前
kCFRunLoopAfterWaiting = (1UL << 6),
kCFRunLoopExit = (1UL << 7),
kCFRunLoopAllActivities = 0x0FFFFFFFU
};
*/
// 创建observer
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"----监听到RunLoop状态发生改变---%zd", activity);
});
// 添加观察者:监听RunLoop的状态
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
// 释放Observer
CFRelease(observer);
/*
Core Foundation内存管理
* 遇到Creat copy retain 等创建变量 需要对变量进行内存管理
*在使用完之后 对其进行Release 调用CFRelease(释放的变量)
*/
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"??");
}