iOS30|iOS30 -- 多线程进阶学习

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

iOS30|iOS30 -- 多线程进阶学习
文章图片
打印1和打印2时间间隔相差了3秒
iOS30|iOS30 -- 多线程进阶学习
文章图片
.0相当于0.0/ 传0的时候,看到1和2的打印非常接近,几乎一起打印的,当然咯,先后顺序肯定有
iOS30|iOS30 -- 多线程进阶学习
文章图片
performSelector底层是定时器,而定时器依赖于runloop,但是子线程的runloop默认是不开启的,所以performSelector方法在子线程不会执行
iOS30|iOS30 -- 多线程进阶学习
文章图片

iOS30|iOS30 -- 多线程进阶学习
文章图片

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


iOS30|iOS30 -- 多线程进阶学习
文章图片
面试题 【iOS30|iOS30 -- 多线程进阶学习】=========[self performSelector:@selector(test) withObject:nil afterDelay:1.0]的底层源码======

iOS30|iOS30 -- 多线程进阶学习
文章图片
也就是说底层是把定时器加到runloop中了的
iOS30|iOS30 -- 多线程进阶学习
文章图片

iOS30|iOS30 -- 多线程进阶学习
文章图片
run方法的底层原理
addport这行代码可以去掉,因为performSelector方法里面已经往runloop里面添加了timer,此时runloop里面已经有东西了,所以只要启动runloop就好了
runloop 在跑起来之前,runloop里面必须有东西,才行!

iOS30|iOS30 -- 多线程进阶学习
文章图片

iOS30|iOS30 -- 多线程进阶学习
文章图片

iOS30|iOS30 -- 多线程进阶学习
文章图片

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

    推荐阅读