如何避免在Block里用self造成循环引用

简介: <p style="padding-top:0px; padding-bottom:0px; margin-top:0px; margin-bottom:0px; clear:both; height:auto; overflow:hidden; color:rgb(80,80,80); font-family:宋体,'Arial Narrow',arial,serif; font-siz

一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copy,copy到堆中,以便后用。

当一个Block被Copy的时候,如果你在Block里进行了一些调用,那么将会有一个强引用指向这些调用方法的调用者,有两个规则:


  • 如果你是通过引用来访问一个实例变量,那么将强引用至self

  • 如果你是通过值来访问一个实例变量,那么将直接强引用至这个“值”变量

苹果官方文档里有两个例子来说明这两种情况:


上面第一种情况相当于用self.xxx来访问实例变量,所以强引用指向了self;第二种情况把实例变量变成了本地临时变量,强引用将直接指向这个本地的临时变量。大多数情况下,我们只用处理第一种情况就行了,因为第二种情况虽然会造成循环引用,但是临时变量很快就被释放了,不会造成真正的循环引用。要避免强引用到self的话,用__weak把self重新引用一下就行了,像这样:

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. __weak ViewController *weakSelf = self;  


目录
相关文章
|
8月前
|
存储 JavaScript 前端开发
|
8月前
|
C++
记录一次循环引用的问题
记录一次循环引用的问题
|
3月前
|
缓存 Java 测试技术
如何避免内存泄漏
【10月更文挑战第19天】如何避免内存泄漏
43 0
|
3月前
|
存储 JavaScript 前端开发
什么是循环引用现象呢
【10月更文挑战第13天】什么是循环引用现象呢
32 0
|
7月前
|
Web App开发 存储 JavaScript
如何避免闭包函数的内存泄漏
如何避免闭包函数的内存泄漏
54 0
|
存储 数据库
如何解决循环引用的问题
解决循环引用的问题
261 0
|
设计模式 Java
8.2 内部类的性能考虑:如何避免内存泄漏
8.2 内部类的性能考虑:如何避免内存泄漏
135 0
|
IDE Java 编译器
记一次inline使用不当导致编译期Null指针的排查过程
周五的一个下午,我哼着小曲和往常一样合完代码。准备运行试试看,结果build时发现了这样一个异常。
148 0
记一次inline使用不当导致编译期Null指针的排查过程
你知道block循环引用怎么解决了吗?
在使用block的时候,最需要注意的问题便是循环引用,这节主要讲解,block是如何产生的?碰到循环引用又该怎么解决。
185 0
你知道block循环引用怎么解决了吗?
|
iOS开发
block的循环引用分析
block的循环引用分析
144 0
block的循环引用分析