循环引用:你引用我,我引用你, 双方都不会销毁, 造成内存泄漏。
关于Block需知: Block会对代码块中的所有强指针变量都强引用一次
假设有此场景, 由A控制器模态出B控制器,在B控制器中定义block属性,在block代码块中打印当前控制器对象。
代码如下:
A控制器 (此处延伸一点,代码块执行完毕,modalVc对象并不会销毁,因为把modelVc 赋值给了 self.presentedViewController,强引用了modalvc对象)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
ModalViewController *modalVc = [[ModalViewController alloc] init];
modalVc.view.backgroundColor = [UIColor greenColor];
[self presentViewController:modalVc animated:YES completion:nil];
}
B控制器
@property (nonatomic, strong) void(^block)();
- (void)dealloc {
NSLog(@"%s", __func__);
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
_block = ^{
NSLog(@"%@", self);
};
_block();
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvenT *)event {
//调用dismissViewControllerAnimated ,就会销毁此控制器
[self dismissViewControllerAnimated:YES completion:nil];
}
如果让B控制器调用dismissViewControllerAnimated, 此时dealloc方法并不会执行,B控制器强引用了block, block又强引用了B控制器,造成循环引用,双方都不会销毁。
解决此问题只需将block不再持有B控制器
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
__weak typeof(self) weakSelf = self;
_block = ^{
NSLog(@"%@", weakSelf);
};
_block();
}
那有没有在block需要销毁之前,做个延迟操作呢?当B控制器调用dismissViewControllerAnimated方法,就会销毁, 拿不到对象,如何做延迟操作。 再用强指针引用一次。
__weak typeof(self) weakSelf = self;
_block = ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"%@",strongSelf);
});
};
_block();
网友评论