iOS开发——Block引起循环引用的解决方案
来源:互联网 发布:宜家床垫 知乎 编辑:程序博客网 时间:2024/05/18 01:53
内存问题始终是软件开发中的头等大事,iOS开发中也不例外,在面试中也是必问的问题。今天我们主要来讲讲Block中涉及的循环引用问题。当我们自己一开始写代码的时候,可能会大量在block中使用self,但是当看到别人优秀的代码的时候,发现别人常常不是用self,而使用weakSelf. 为什么呢?本文的示例代码上传至 https://github.com/chenyufeng1991/Block_WeakSelf 。
首先我先来说说内存管理的原则:
1.默认使用strong,可选weak。strong下不管成员变量还是属性,每次使用指针指向一个对象,就会自动调用retain,并对旧对象调用release,在需要释放的时候设为nil。
2.避免循环引用,否则手动设置nil释放。
3.创建block匿名函数之前一般需要对self进行weak化,否则造成循环引用无法释放controller。
首先Xcode为我们提供了良好的编译环境,如果代码中有可能出现循环引用的地方,Xcode会给我们警告:“Capturing 'self' strongly in this block is likely to lead to a retain cycle”.
block中的循环引用是这样的:某个对象有一个copy或者strong成员变量或者属性,这时block内部直接引用了成员变量或者self,这样就产生了self持有block成员,block成员持有self,就会导致循环引用。因为self本身就是一个strong类型的变量。苹果官方的建议是:传进block之前,把self转换成weak automatic的变量,这样在block中就不会出现对self的强引用。如果在block执行完成之前,self被释放,weakSelf也会置为nil。weak类型相对比较安全,因为可以在释放后自动置为nil,不会引起野指针。那么如何来声明呢?
1.
这句话的意思是声明了一个self类型的weak指针,名字叫做weakSelf. typeof是用来求参数类型的,这里也就是来求self的类型。这样定义出的weakSelf就是和self是一个类型,并且是原self的一个弱引用。
2.
3.
下面我通过代码演示一下:
(1)声明几个block和一个属性:
(2)使用weakSelf不会引起循环引用:
(3)直接使用self,会循环引用:Xcode会给警告
(4)要执行的方法抽取出来,也不会循环引用:
(5)block不是self的属性或者变量时,在block内使用self也不会循环引用:
(6)block的调用如下:
- iOS开发——Block引起循环引用的解决方案
- iOS开发——Block引起循环引用的解决方案
- iOS开发——Block循环引用问题的解决
- iOS开发之Block的循环引用
- iOS中 block 导致 reference loop "引用循环" 引起的leak
- iOS开发-Block使用及循环引用的解决
- iOS开发--Block容易造成循环引用
- block里使用self引起循环引用的研究
- ios中block的循环引用
- iOS Block的循环引用问题
- IOS 如何避免Block的循环引用
- iOS中Block的循环引用问题
- iOS中block的循环引用问题
- iOS Block 中 循环引用的解决
- iOS Block源码分析系列(四)————__block和Block的循环引用
- Block的循环引用
- Block的循环引用
- 循环引用的block
- 前端数据模拟---mock.js 使用教程
- 【PHP-漏洞之一】跨网站请求伪造
- .NET开发中遇到的一些问题汇总
- unity NetWorking小案例
- spring boot+dubbo
- iOS开发——Block引起循环引用的解决方案
- Mybatis SQL映射语句中参数注解使用规则
- 【剑指offer】不用加减乘除来做加法
- Android:exported 属性详解
- 在linux服务器上搭建ngrok服务
- 反腐剧《人民的名义》大结局提前看
- ServletConfig
- Struts 04
- slf4j + logback eclipse控制台无法打印输出问题