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 可视化检测循环引用
- 强引用、软引用、弱引用、虚引用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网站转换率优化之道
[美] Khalid Saleh、[美] Ayat Shukairy / 顾 毅 / 人民邮电出版社 / 2012-4 / 45.00元
内容简介: 怎样才能将访问者转化为顾客? 本书提供了一些切实可行的建议,比如如何说服访问者作出购买决定,如何避免用户因信息过量或导航繁琐而离开网站等。不论你是在设计或营销大型电子商务网站,还是在管理中小型在线业务,都可以从本书学会怎样使用市场营销原则、设计方法、可用性原则和分析数据来持续提升网站的转换率。 作者帮助过众多公司吸引在线顾客,有着丰富的实战经验,在书中细致讨论了从访问......一起来看看 《网站转换率优化之道》 这本书的介绍吧!