Block中内存泄露问题

作者: 傲视苍穹 | 来源:发表于2015-12-05 10:19 被阅读142次

内存泄露不仅存在于MRC(MannulReference Counting)中,而且也存在于ARC(Automatic Reference Counting)也存在内存泄露问题。

注意:Xcode 4.1及其以前版本没有ARC

自从我们使用了ARC,代码写起来方便了很多,我们写不需要retain,release,dealloc了,但是有些特殊情况我们需要写dealloc方法,例如:当我们使用 通知 ,KVO的时候我们需要在dealloc方法中移除观察者,这时候我们不需要写[super dealloc]。而在ARC中最常见的内存泄露地方之一就是在Block中。

如果你不打印一下dealloc中的信息,也许你还真的不知道你的controller,view等等资源没有释放。很多问题都可能造成资源不能够及时释放。其中有一个很容易忽略的问题,block会自动retain你的变量。

如果你引用的是一个实例变量(如果你对实例变量不太清楚的可以看看:http://www.lxway.com/482926291.htm),它会直接对self进行retain,这有时候有可能会产生一个引用环(两个或以上的对象之间直接或间接地互相引用)并导致内存泄露。解决的方法是:当需要在Block中访问实例变量的时候,创建一个指向self的指针,如果在MRC工程中对其使用__block修饰符,而在ARC工程中对其使用__weak修饰符,这样self不会被自动retain:

通常来说,block都是一些简短代码片段的封装,适用做工作单元,通常用来做并发任务、遍历以及回调。

特别注意:

1、block需要注意的一个特性就是"Variable Capturing",直译过来就是捕捉变量。

2、block会将“捕捉”到的变量复制一份,然后对复制品进行操作,这是非常重要的一点

相关文章

  • Block中内存泄露问题

    内存泄露不仅存在于MRC(MannulReference Counting)中,而且也存在于ARC(Automat...

  • 关于Block内存泄露问题

    考虑到block的创建问题网络上已经有很多文章,所以我这里就不做过多的阐述,有需要的盆友们可以自己去找一下哈~我这...

  • iOS 性能优化

    列举在项目开发中可能遇到的优化点 1、内存泄露检测可能出现内存泄露的地方:循环引用,block强引用,NSTime...

  • 文章目录

    block block内强引用导致的内存泄露 NStimer UITableView滚动式NSTimer停止计数 ...

  • 项目中优化细节

    一.内存优化 1.减少内存泄露。如Timer,Delegate,Block,CoreFoundation对象(C对...

  • iOS 底层 day29 循环引用 和 内存泄露

    一、UIView 的 block 写动画 1. 请问下面代码有内存泄露吗?有循环引用吗? 没有内存泄露,也没有循环...

  • iOS - 性能优化

    内存方面 检测内存泄露 block使用上的强强循环导致页面不释放 :规范block使用,避免循环不释放 创建很多临...

  • Android内存泄露详解

    内存泄露 在开发应用的过程中,我们总会遇到内存泄露的问题。现在通过代码列出一些常见的内存泄露的情况以及解决方案。 ...

  • iOS开发-Block容易造成循环引用

    一 、Block的内存泄露体现block在copy时都会对block内部用到的对象进行强引用(ARC)或者reta...

  • Android 内存优化总结&实践

    内存泄露 大部分的内存问题都是内存泄露导致的,Android里也有一些很常见的内存泄露问题这里简单罗列下: 详细见...

网友评论

    本文标题:Block中内存泄露问题

    本文链接:https://www.haomeiwen.com/subject/oxdshttx.html