iOS30|iOS30 -- 多线程进阶学习
- (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里面添加了一个定时器
文章图片
面试题 【iOS30|iOS30 -- 多线程进阶学习】=========[self performSelector:@selector(test) withObject:nil afterDelay:1.0]的底层源码======
文章图片
也就是说底层是把定时器加到runloop中了的
文章图片
文章图片
run方法的底层原理
addport这行代码可以去掉,因为performSelector方法里面已经往runloop里面添加了timer,此时runloop里面已经有东西了,所以只要启动runloop就好了
runloop 在跑起来之前,runloop里面必须有东西,才行!
文章图片
文章图片
文章图片
文章图片
启动子线程后,该子线程打印完1之后,该子线程就退出了。这个时候再去该子线程执行test方法,但是该子线程都不存在了,肯定有问题
文章图片
在该子线程启动runloop之后,线程就不会死了,就能正常执行test方法
文章图片
这种情况点击就没有任何反应了
推荐阅读
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- Linux下面如何查看tomcat已经使用多少线程
- 说得清,说不清