美文网首页
ios Block之内存泄漏

ios Block之内存泄漏

作者: Mikayla321 | 来源:发表于2018-05-21 18:45 被阅读0次

在使用block时引起强引用循环时会导致严重的内存泄漏,而大家要注意的是,循环强引用的条件是block中引用了强引用的self,而另一必要条件是self也同时引用了block。

代码:

model.h文件 model.m文件 vc.m文件

DetailViewController中强引用TestModel,TestModel强引用TestBlock,TestBlock强引用self,造成循环引用,从而内存泄漏;

解决办法:

__weak typeof(self)weakSelf = self;

    [self.model setTestBlock:^{

    __strong typeof(weakSelf)strongSelf = weakSelf; 

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

            [strongSelf test];

        });

    }];

这时Block 对象虽然捕获了weakSelf,延长了weakSelf这个局部变量的生命周期,但weakSelf是附有__weak修饰符的变量,它并不会持有对象,一旦它指向的对象被废弃了,它将自动被赋值为nil。在多线程情况下,可能weakSelf指向的对象会在 Block 执行前被废弃,这样可能顶多就是返回nil,但在有些情况下(譬如在 Block 中有移除 KVO 的观察者的逻辑,在执行到该逻辑前 self 就释放了)就会导致 crash。这时可以在 Block 内部(第一句)再持有一次weakSelf指向的对象,保证在执行 Block 期间该对象不会被废弃,这就是所谓的 weak-strong

相关文章

网友评论

      本文标题:ios Block之内存泄漏

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