iOS30 -- 多线程进阶学习

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument 
afterDelay:(NSTimeInterval)delay;
iOS30 -- 多线程进阶学习_第1张图片
打印1和打印2时间间隔相差了3秒

iOS30 -- 多线程进阶学习_第2张图片
.0相当于0.0/ 传0的时候,看到1和2的打印非常接近,几乎一起打印的,当然咯,先后顺序肯定有

iOS30 -- 多线程进阶学习_第3张图片
performSelector底层是定时器,而定时器依赖于runloop,但是子线程的runloop默认是不开启的,所以performSelector方法在子线程不会执行

iOS30 -- 多线程进阶学习_第4张图片

iOS30 -- 多线程进阶学习_第5张图片

performSelector:withObject:方法的底层现实。也就是说调用[self performSelector:@selector(test) withObject:nil]; 等价于[self test]这样调用test方法

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

iOS30 -- 多线程进阶学习_第7张图片
面试题

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


iOS30 -- 多线程进阶学习_第8张图片
也就是说底层是把定时器加到runloop中了的

iOS30 -- 多线程进阶学习_第9张图片

iOS30 -- 多线程进阶学习_第10张图片
run方法的底层原理

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

iOS30 -- 多线程进阶学习_第12张图片

iOS30 -- 多线程进阶学习_第13张图片

iOS30 -- 多线程进阶学习_第14张图片
启动子线程后,该子线程打印完1之后,该子线程就退出了。这个时候再去该子线程执行test方法,但是该子线程都不存在了,肯定有问题

iOS30 -- 多线程进阶学习_第15张图片
在该子线程启动runloop之后,线程就不会死了,就能正常执行test方法

iOS30 -- 多线程进阶学习_第16张图片
这种情况点击就没有任何反应了

你可能感兴趣的:(iOS30 -- 多线程进阶学习)