美文网首页
iOS30 -- 多线程进阶学习

iOS30 -- 多线程进阶学习

作者: 恋空K | 来源:发表于2021-01-08 11:25 被阅读0次
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument 
afterDelay:(NSTimeInterval)delay;
打印1和打印2时间间隔相差了3秒
.0相当于0.0/ 传0的时候,看到1和2的打印非常接近,几乎一起打印的,当然咯,先后顺序肯定有
performSelector底层是定时器,而定时器依赖于runloop,但是子线程的runloop默认是不开启的,所以performSelector方法在子线程不会执行


performSelector:withObject:方法的底层现实。也就是说调用[self performSelector:@selector(test) withObject:nil]; 等价于[self test]这样调用test方法
[self performSelector:@selector(test) withObject:nil afterDelay:1.0];底层实现原理
是用到了NSTimer定时器。而定时器是要添加到runloop里面去的。所以这行代码的本质就是添加了一个定时器
放到runloop里面去。也就是往runloop里面添加了一个定时器

面试题

=========[self performSelector:@selector(test) withObject:nil afterDelay:1.0]的底层源码======


也就是说底层是把定时器加到runloop中了的

run方法的底层原理
addport这行代码可以去掉,因为performSelector方法里面已经往runloop里面添加了timer,此时runloop里面已经有东西了,所以只要启动runloop就好了
runloop 在跑起来之前,runloop里面必须有东西,才行!



启动子线程后,该子线程打印完1之后,该子线程就退出了。这个时候再去该子线程执行test方法,但是该子线程都不存在了,肯定有问题
在该子线程启动runloop之后,线程就不会死了,就能正常执行test方法
这种情况点击就没有任何反应了

相关文章

网友评论

      本文标题:iOS30 -- 多线程进阶学习

      本文链接:https://www.haomeiwen.com/subject/gokrnktx.html