美文网首页
block的循环引用

block的循环引用

作者: 岩大大 | 来源:发表于2016-12-13 16:51 被阅读0次

    什么是循环引用呢?

    就是我引用你,你引用我,就会造成循环引用,双方都不会被销毁,导致内存泄漏。

    _block =  ^{

    NSLog(@"%@", self);

    };

    block会对里面强指针变量self强引用一次,造成循环引用。

    下面说明一下循环引用是怎么发生的?

    1.控制器对象里面有个block属性;

    2.block属性指向了一个代码块,就会分配内存,就会有一个block对象;

    3.block对象里面有一个外部对象变量self,就会对self强引用,self指针指向的是控制器对象。而控制器对象的block指针指向的是block对象。两个互相引用,就会造成循环引用,无法销毁。

    如何解决循环引用呢?

    把强指针变成弱指针。

    __weak typeof(self) weakself= self; 

    _block =  ^{

    NSLog(@"%@", weakself);

    };

    还有一种更麻烦的循环引用,代码如下:

    __weak typeof(self) weakself= self;

    _block =  ^{

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    NSLog(@"%@", weakSelf);

    });

    };

    _block();

    block里面有一个延迟操作,但是控制器对象已经提前销毁,拿不到weakSelf了,无法打印。

    如何解决呢?

    我们可以再定义一个强指针,dispatch_after的block会对外面的强指针强引用,在执行完以后,才会被销毁。

    代码如下:

    __weak typeof(self) weakself= self;

    _block =  ^{

    __strong typeof(weakself) strongSelf = weakself;

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    NSLog(@"%@", strongSelf);

    });

    };

    _block();

    相关文章

      网友评论

          本文标题:block的循环引用

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