资讯专栏INFORMATION COLUMN

Objective-C中block的循环引用问题

Winer / 1271人阅读

摘要:或者使用了对象的属性在这样的情况下,强引用,也持有该对象,导致循环引用。一般使用或时使用的内联是不会出现循环引用的。而在过程中,是不会释放的,完美。这可能会导致奇怪的问题。

目标:block执行过程中,self不会释放;执行完可以释放。

最初

block中直接使用self会强引用。

self.myBlock = ^() {
    [self doSomething];
};

或者使用了对象的属性

self.myBlock = ^() {
    NSString *str = _str;
    NSString *str2 = self.str;
};

在这样的情况下,self强引用block,block也持有该对象,导致循环引用。

要注意的是,只有在self强引用block的时候才会有这样的问题。一般使用GCD或NSOperation时使用的内联block是不会出现循环引用的。

加入weak self
__weak __typeof(self) weakSelf = self;
self.myBlock = ^() {
    [weakSelf doSomething];
};

这样,self持有了block,但block对self是弱引用,就不会导致循环引用了。

而在[weakSelf doSomething]过程中,self是不会释放的,完美。

但是,如果是这样呢?

__weak __typeof(self) weakSelf = self;
self.myBlock = ^() {
    [weakSelf doSomething];
    [weakSelf doSomething2];
};

[weakSelf doSomething][weakSelf doSomething2]之间,self可能会被释放掉。这可能会导致奇怪的问题。

加入strong self
__weak __typeof(self) weakSelf = self;
self.myBlock = ^() {
    __strong __typeof(self) strongSelf = weakSelf;
    [strongSelf doSomething];
    [strongSelf doSomething2];
};

这样,block既没有持有self,又能保证block在执行过程中self不被释放,真正达到了最初的目标。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17322.html

相关文章

  • [译文]在iOS上自动检测内存泄露

    摘要:追踪内存泄露的根源。为此,在我们的开发周期上,我们可能无法尽可能早的定位和修复内存泄露问题。自动化可以在不需要更多开发者的情况下,更快的找到内存泄露。 博文链接:http://ifujun.com/yi-wen-zai-iosshang-zi-dong-jian-ce-nei-cun-xie-lu/原文链接:https://code.facebook.com/posts/5839463...

    miguel.jiang 评论0 收藏0
  • Objective-C内存管理(2)——从MRC到ARC

    摘要:在里,每个继承自的对象都会记录自身的引用计数,一番加加减减之后,变成就会释放掉。引用计数减少的操作就是了。要知道,返回的对象引用计数是有的,而并不是。 罗里吧嗦颠三倒四,单纯的个人笔记。 MRC 引用计数上一篇已经有大概讲过。在Objective-C里,每个继承自NSObject的对象都会记录自身的引用计数,一番加加减减之后,变成0就会释放掉。MRC是Mannul Reference ...

    luck 评论0 收藏0
  • iOS 进阶必读 - 收藏集 - 掘金

    摘要:深入研究捕获外部变量和实现原理掘金前言是语言的扩充功能,而在和中引入了这个新功能。是由和两位大神在对的开发过程中中所有变换操作底层实现分析上掘金前言在上篇文章中,详细分析了是创建和订阅的详细过程。 深入研究Block捕获外部变量和__block实现原理 - 掘金 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能B...

    sf_wangchong 评论0 收藏0
  • iOS 进阶必读 - 收藏集 - 掘金

    摘要:深入研究捕获外部变量和实现原理掘金前言是语言的扩充功能,而在和中引入了这个新功能。是由和两位大神在对的开发过程中中所有变换操作底层实现分析上掘金前言在上篇文章中,详细分析了是创建和订阅的详细过程。 深入研究Block捕获外部变量和__block实现原理 - 掘金前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能Bl...

    szysky 评论0 收藏0
  • iOS 进阶必读

    摘要:广州线下活动八面玲珑的淘宝出品月日,由淘宝主办的地下铁沙龙在广州广电平云广场举办。此次邀请的嘉宾在方面有所实践探索,分别来自腾讯淘宝公司。从这次入院考试开始,就成功入院了。一常见类信号类。然而实际使用过程中,还是会遇到一些问题,比如的问题。 初探 CALayer 属性 一直觉得一个 view 就一个 layer,到今天才发现不是这样子的。 Xcode8调试黑科技:Memory Grap...

    waruqi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<