- 线程的生命周期与控制器的生命周期无关.
- 首先看示例的效果图
- Viewcontroller中的代码
#import "ViewController.h"
#import "TwoViewController.h"
@interface ViewController ()
@end
@implementation ViewController
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"开始");
TwoViewController * vc = [TwoViewController new];
[vc demoWithBlock:^(NSString *str) {
NSLog(@"%@",str);
}];
}
- 当触摸屏幕的时候创建TwoViewcontroller 然后执行vc的方法,看TwoViewcontroller中的方法如何实现的
-(void)demoWithBlock:(void (^)(NSString *))block{
NSLog(@"开始执行dmeo");
//全局队列异步执行,不堵塞主线程
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//然线程睡 4s
[NSThread sleepForTimeInterval:4.0];
//主队列执行block,回调block.
dispatch_async(dispatch_get_main_queue(), ^{
block(@"回去");
});
});
}
- 从图片演示上看:当点击屏幕的时候创建了vc,然后执行了vc的方法,当点击方法执行完毕后,vc被释放.但是添加到队列中的任务block并没有被释放.而是根据我们做的延迟执行了.
小结: 当任务被添加到队列以后就不会被销毁,即使是控制器被销毁,任务也不会被销毁或者暂停.就想 "泼出去的水,你收不回来,只能任它蒸发..."
网友评论