Objective-C中block循环引用问题详解

2025-05-29 0 45

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

最初

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

?

1

2

3
self.myBlock = ^() {

[self doSomething];

};

或者使用了对象的属性

?

1

2

3

4
self.myBlock = ^() {

NSString *str = _str;

NSString *str2 = self.str;

};

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

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

加入weak self

?

1

2

3

4
__weak __typeof(self) weakSelf = self;

self.myBlock = ^() {

[weakSelf doSomething];

};

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

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

但是,如果是这样呢?

?

1

2

3

4

5
__weak __typeof(self) weakSelf = self;

self.myBlock = ^() {

[weakSelf doSomething];

[weakSelf doSomething2];

};

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

加入strong self

?

1

2

3

4

5

6
__weak __typeof(self) weakSelf = self;

self.myBlock = ^() {

__strong __typeof(self) strongSelf = weakSelf;

[strongSelf doSomething];

[strongSelf doSomething2];

};

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对快网idc的支持。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Objective-C中block循环引用问题详解 https://www.kuaiidc.com/89337.html

相关文章

发表评论
暂无评论