Objective-C中block的循环引用问题
栏目: Objective-C · 发布时间: 6年前
内容简介:目标:block执行过程中,self不会释放;执行完可以释放。block中直接使用self会强引用。或者使用了对象的属性
目标: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不被释放,真正达到了最初的目标。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 考古 - HttpInterceptor 循环引用错误
- iOS: Block的循环引用
- iOS: NSTimer的循环引用(解决)
- element上传组件循环引用及简单时间倒计时
- 内存二三事: Xcode 内存图、Instruments 可视化检测循环引用
- 强引用、软引用、弱引用、虚引用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Spring揭秘
王福强 / 人民邮电出版社 / 2009.8 / 99.00元
没有教程似的训导,更多的是说故事般的娓娓道来,本书是作者在多年的工作中积累的第一手Spring框架使用经验的总结,深入剖析了Spring框架各个模块的功能、出现的背景、设计理念和设计原理,揭开了Spring框架的神秘面纱,使你“知其然,更知其所以然”。每部分的扩展篇帮助读者活学活用Spring框架的方方面面,同时可以触类旁通,衍生出新的思路和解决方案。 本书内容全面,论述深刻入理,必将成为每......一起来看看 《Spring揭秘》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
图片转BASE64编码
在线图片转Base64编码工具