block的循环引用

block中的循环引用是这样的:某个对象有一个copy或者strong成员变量或者属性,这时block内部直接引用了成员变量或者self,这样就产生了self持有block成员,block成员持有self,就会导致循环引用。因为self本身就是一个strong类型的变量。
建议:在穿进block之前,先把self转换为weak automatic的变量;如下:

__weak typeof(self) we = self;
声明了一个self类型的weak指针,名字叫做weakSelf.  typeof是用来求参数类型的,这里也就是来求self的类型。这样定义出的weakSelf就是和self是一个类型,并且是原self的一个弱引用。

这样在block中使用self或者self拥有的strong变量的时候就不会造成循环引用。

当然还有其他的解决方式:

#import "ViewController.h"

@interface ViewController ()
{
    void(^blk_t)(void);
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //这种造成的循环是在block内使用了self,而self拥有blk_t
    id __weak weakself = self;//解决的方式
    blk_t = ^{
        NSLog(@"===%@",weakself);
    };
}

#import "ViewController.h"

@interface ViewController ()
{
    void(^blk_t)(void);
}
@property (nonatomic, strong) id obj;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //这种造成的循环是在block内使用了obj
    id __weak obj_ = _obj;
    blk_t = ^{
        NSLog(@"===%@",obj_);
    };
}
当然还有其他的解决方式:
__block id obj_ = _obj;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容