如下代码,在执行 BViewController 被 close 以后, self 由于在gcd存在引用,不会被释放
#import "BViewController.h"
@interface BViewController ()
@property (weak, nonatomic) IBOutlet UILabel *mylable;
@end
@implementation BViewController
- (void)viewDidLoad {
[super viewDidLoad];
// __weak typeof(self) weakself= self;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[NSThread sleepForTimeInterval:4.0];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@",@"BViewController1");
// 如果控制器死了,那么不要往下 执行了
// if(weakself==nil) return;
NSLog(@"%@",@"BViewController2");
self.mylable.text=@"跟新UI";
});
});
}
-(void)dealloc{
NSLog(@"%@",@"B控制器死了");
}
@end
执行结果:
2020-07-14 11:10:57.058989+0800 AToB[16026:254057] BViewController1
2020-07-14 11:10:57.059243+0800 AToB[16026:254057] BViewController2
2020-07-14 11:10:57.059532+0800 AToB[16026:254057] B控制器死了
如上代码,B控制器 死了,但是 没有 由于gcd中 对 B 控制器有 self 应用,那么 B控制 不能立刻销毁
等 gcd 执行完毕以后 B 控制器 才 销毁
B控制器 关闭的时候,就应该 销毁, 解决,定义弱引用:
#import "BViewController.h"
@interface BViewController ()
@property (weak, nonatomic) IBOutlet UILabel *mylable;
@end
@implementation BViewController
- (void)viewDidLoad {
[super viewDidLoad];
__weak typeof(self) weakself= self;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[NSThread sleepForTimeInterval:4.0];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@",@"BViewController1");
// 如果控制器死了,那么不要往下 执行了
if(weakself==nil) return;
NSLog(@"%@",@"BViewController2");
weakself.mylable.text=@"跟新UI";
});
});
}
-(void)dealloc{
NSLog(@"%@",@"B控制器死了");
}
@end
2020-07-14 11:12:28.594998+0800 AToB[16073:255419] B控制器死了
2020-07-14 11:12:30.227661+0800 AToB[16073:255419] BViewController1