底层17:RunLoop-休眠、NSTimer失效、线程保活

2020-09-06  本文已影响0人  张无奈

RunLoop休眠

内核层面的API:不提供给开发者用。

应用层面的API:

RunLoop休眠的原理:通过mach_msg()让用户态跟内核态的切换,没有消息就切换到内核态休息,有消息就切换到用户态。

NSTimer失效

是因为在默认模式下,当拉拽的时候,应该在跟踪模式下,就不会执行。

RunLoop同一时间只能运行在某一种mode下,可以设置为NSRunLoopCommonModes

线程保活:

方法一如下:

上面代码会造成引用,控制器和线程在跳转下一个界面返回 都不会死,所以优化:

stop方法中waitUntilDone:设置为NO会导致坏内存报错,因为self已经销毁,继续执行会报错,需要改为yes。这样后还是会出现问题,因为self已经销毁,那么weakself.isStoped 就是为nil,取反为yes,会再次启动线程。所以需要在while循环改下条件如下:

这样以后还是会报错再次优化- (void)stopThread方法中将线程置为nil,在别的地方判断下线程不存在就会返回if (!self.thread) return;

上一篇 下一篇

猜你喜欢

热点阅读