美文网首页
block的循环引用

block的循环引用

作者: zhouios | 来源:发表于2017-03-31 15:31 被阅读0次

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;

相关文章

网友评论

      本文标题:block的循环引用

      本文链接:https://www.haomeiwen.com/subject/zurvottx.html