iOS闭包循环引用讲解
2016-02-29 13:37
274 查看
前言
本篇文章精讲iOS开发中使用Block时一定要注意内存管理问题,很容易造成循环引用。本篇文章的目标是帮助大家快速掌握使用block的技巧。我相信大家都觉得使用block给开发带来了多大的便利,但是有很多开发者对block内存管理掌握得不够好,导致经常出现循环引用的问题。对于新手来说,出现循环引用时,是很难去查找的,因此通过Leaks不一定能检测出来,更重要的还是要靠自己的分析来推断出来。
声景一:Controller之间block传值
现在,我们声明两个控制器类,一个叫ViewController,另一个叫HYBAController。其中,ViewController有一个按钮,点击时会push到HYBAController下。先看HYBAController:
![](http://www.henishuo.com/wp-content/uploads/2016/02/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2016-02-18-%E4%B8%8B%E5%8D%889.07.32.png)
可以简单说,这里形成了两个环:
ViewController->强引用了属性vc->强引用了callback->强引用了ViewController
ViewController->强引用了属性vc->强引用了callback->强引用了ViewController的属性button
对于此这问题,我们要解决内存循环引用问题,可以这么解:
不声明vc属性或者将vc属性声明为weak引用的类型,在callback回调处,将self.button改成weakSelf.button,也就是让callback这个block对viewcontroller改成弱引用。如就是改成如下,内存就可以正常释放了:
针对这种场景,给大家提点建议:
在控制器的生命周期viewDidAppear里打印日志:
场景二:Controller与View之间Block传值
我们先定义一个view,用于与Controller交互。当点击view的按钮时,就会通过block回调给controller,也就反馈到控制器了,并将对应的数据传给控制器以记录:分析:如下图所示:
![](http://www.henishuo.com/wp-content/uploads/2016/02/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2016-02-18-%E4%B8%8B%E5%8D%889.48.41.png)
所形成的环有:
vc->aView->block->vc(self)
vc->aView->block->vc.currentModel
解决的办法可以是:在创建aView时,block内对currentModel的引用改成弱引用:
模拟循环引用
假设下面如此写代码,是否出现内存得不到释放问题?(其中,controller属性都是强引用声明的)@autoreleasepool { A *aVC = [[A alloc] init]; B *bVC = [[B allcok] init]; aVC.controller = bVC; bVC.controller = aVC; }
分析:
aVC->强引用了bVC->强引用了aVC,因此形成了一个环,导致内存得不到释放。
写在最后
本篇文章就讲这么多吧,写本篇文章的目的是教大家如何分析内存是否形成环,只要懂得了如何去分析内存是否循环引用了,那么在开发时一定会特别注意内存管理问题,而且查找内存相关的问题的bug时,也比较轻松。
源
相关文章推荐
- iOS开发中如何合理地制造BUG
- iOS开发技巧系列---打造强大的BaseModel
- iOS中创建.gitignore文件
- iOS动画图层 — iOS模糊效果
- ios怎么让图片只有上半边圆角?
- iOS自带的拨号和短信功能
- iOS开发--即时通讯常用第三方库
- iOS8 之后对 SearchController的使用
- iOS国际化(多国语言设置)
- iOS开发之键盘
- iOS EXC_BAD_ACCESS的本质详解以及僵尸模式调试原理
- iOS导航及分享归纳与整理
- iOS开发--xcode快捷键
- iOS打电话
- iOS开发之首次启动引导页的两种处理方法简析
- iOS开发笔记--xcode7安装Alcatraz插件管理器
- iOS/mac开发的一些知名个人博客
- iOS学习笔记64-Apple Pay编程指南
- iOS开发多线程--技术方案
- iOS开发--完整项目