1.计时器初始化方法
1.1 快速初始化方式
+ (NSTimer*)scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void(^)(NSTimer*timer))blockAPI_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
初始化之后便可以直接在回调中写需要做的事情,不需要把计时器添加到 runloop 中,因为默认已经把它添加到当前 runloop 中了.
1.2 自定义初始化方式
+ (NSTimer*)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void(^)(NSTimer*timer))blockAPI_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
自定义初始化之后,需要在回调中写完需要做的事情之后,还需要手动把计时器添加到 runloop 中.
2.Runloop - 运行循环
2.1 循环 和 递归 的区别?
1.函数调用函数叫做递归,函数调用会开辟栈空间,所以死递归会崩溃.
2.循环是重复执行,循环不消耗内存,死循环不会崩溃.
2.2 Runloop 死循环的目的所在?
1.保证程序不挂.
2.监听事件.(触摸,时钟,网络)
3.特性:如果没有事件发生,会让程序进行休眠(减少性能损耗)
2.3 Runloop 的五种模式?
(1)默认模式 (列表滚动的时候不会处理计时器)
NSDefaultRunLoopMode
(2)UI模式:1.优先级最高 2.只能被触摸事件所触发 (列表滚动的时候打印,松手的时候执行计时器)
UITrackingRunLoopMode
(3)站位模式:其实就是 默认模式 + UI模式
相当于 UITrackingRunLoopMode + NSDefaultRunLoopMode
NSRunLoopCommonModes
(4)内核事件模式:内核事件的处理 用不着
(5)初始化模式:程序一运行的时候执行 用不着
3.计时器加载到 runloop 的时候需要设置 mode
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:UITrackingRunLoopMode];
网友评论