Block循环引用

循环引用:你引用我,我引用你, 双方都不会销毁, 造成内存泄漏。

关于Block需知: Block会对代码块中的所有强指针变量都强引用一次

假设有此场景, 由A控制器模态出B控制器,在B控制器中定义block属性,在block代码块中打印当前控制器对象。

代码如下:

A控制器 (此处延伸一点,代码块执行完毕,modalVc对象并不会销毁,因为把modelVc 赋值给了 self.presentedViewController,强引用了modalvc对象)
- (void)touchesBegan:(NSSet *)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 *)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();

你可能感兴趣的:(Block循环引用)