欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发“强弱共舞——weak和strong配套使用解决block循环引用问题

程序员文章站 2022-08-11 08:33:53
iOS开发“强弱共舞”——weak和strong配套使用解决Block循环引用问题Objective-C中的Block循环引用是我们iOS开发老生常谈的话题了,不管是日常工作中还是求职面试中一定会涉及到,所以不得不研究清楚。本文简单谈谈“强弱共舞”在Block中的使用和原理。__weak是为了解决循环引用如果一个对象A持有了一个block,同时block内又持有了对象A,为了解决循环引用我们要在用__weak修饰完对象A后再去持有它,这样就解决了循环引用。__strong是为了防止block持有的对...

iOS开发“强弱共舞”——weak和strong配套使用解决block循环引用问题

Objective-C中的Block循环引用是我们iOS开发老生常谈的话题了,不管是日常工作中还是求职面试中一定会涉及到,所以不得不研究清楚。本文简单谈谈“强弱共舞”在block中的使用和原理。

__weak是为了解决循环引用

如果一个对象A持有了一个block,同时block内又持有了对象A,为了解决循环引用我们要在用__weak修饰完对象A后再去持有它,这样就解决了循环引用。

__strong是为了防止block持有的对象提前释放

看如下代码:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self dismissViewControllerAnimated:YES completion:nil];
    
    __weak typeof(self) weakSelf = self;
    self.block = ^{
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            NSLog(@"%@", weakSelf);
        });
    };
    self.block();
}

点击屏幕,当前控制器消失,同时被销毁掉,5秒后打印的weakSelf就是一个(null),而我们如果在block内使用__strong后就能保证再打印完strongSelf之后再释放当前控制器。

  - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self dismissViewControllerAnimated:YES completion:nil];

__weak typeof(self) weakSelf = self;
self.block = ^{
    __strong typeof(self) strongSelf = weakSelf;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"%@", strongSelf);
    });
};
self.block();
}

以上就是“强弱共舞”的一个典型例子。

当然,如果你的block 里面没有涉及到延时操作,直接使用弱引用就行了。

本文地址:https://blog.csdn.net/u010347934/article/details/108175054