Block中内存泄露问题

内存泄露不仅存在于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中内存泄露问题)