依旧Block调用引起的内存泄露
2014-06-05 20:28
351 查看
@前面的文章讲到,在Block中用到self(self特指UIViewController),需要用__block或者__weak修饰(MRC与ARC的区别),因为Block调用会对其里面的对象引用计数加1,如果你不确定你调用的Block是否会产生循环引用的话,最好用__block或__weak修饰.当然,如果你确定并不会产生循环引用的情况,那你可以放心的self. self. (~O(∩_∩)O~).
@自从知道了block容易产生内存泄露的情况,我在很长的一段时间内,只要用到了block,只要里面有self,我全部用__block修饰了(偷懒的做法),但是最近,即使我这样的写了,还是出现了内存泄露的情况,dealloc()一直不执行,找了很久,找了很久,全部都加了__block修饰,依旧泄露,最终发现问题是出现在一个属性上.
@先来看下面这段问题代码:
打了很多断点,测试出来问题就是出在这里,很多人可能会问,已经用__block修饰了,而且并没有出现self呀!请注意_thirdData这个属性,声明的时候是@property (nonatomic,retain)DNWThirdData *thirdData,它是被self所持有,一次释放操作是放在dealloc中,也就是self被释放,_thirdData也释放.在Block中,调用了_thirdData,虽然没有用self.thirdData,但是正如前面所说,它是被self持有,编译访问_thirdData时,会找到持有它的self,对其引用计数加1,所以这里就算没有用到self,self的引用计数也被加1了,这也说明并不是没显示的调用self就不会对其引用计数加1,这个错误真是让我郁闷了好久.接下来改正:[otherSelf
pushDNWWedViewController:otherSelf.thirdData.web_url];就OK了
@当然,还是得说明,如果你确定你的Block调用只是局部的或者不会发生循环引用的问题,那就不用考虑这些了.
@而我这个例子,changeViewBackGround这个Block是属性videoPlayView的属性,而videoPlayView又是self的属性,呗self持有,要等待self的释放才能释放,因为如果不用__block修饰,是一定会产生循环引用而导致内存泄露的问题
@最后套用一句:"具体问题具体分析啦!"
@自从知道了block容易产生内存泄露的情况,我在很长的一段时间内,只要用到了block,只要里面有self,我全部用__block修饰了(偷懒的做法),但是最近,即使我这样的写了,还是出现了内存泄露的情况,dealloc()一直不执行,找了很久,找了很久,全部都加了__block修饰,依旧泄露,最终发现问题是出现在一个属性上.
@先来看下面这段问题代码:
__block DNWThirdVideoSubclassViewController *otherSelf = self; [_videoPlayView changeViewBackGround:^{ [otherSelf pushDNWWedViewController:_thirdData.web_url]; }];
打了很多断点,测试出来问题就是出在这里,很多人可能会问,已经用__block修饰了,而且并没有出现self呀!请注意_thirdData这个属性,声明的时候是@property (nonatomic,retain)DNWThirdData *thirdData,它是被self所持有,一次释放操作是放在dealloc中,也就是self被释放,_thirdData也释放.在Block中,调用了_thirdData,虽然没有用self.thirdData,但是正如前面所说,它是被self持有,编译访问_thirdData时,会找到持有它的self,对其引用计数加1,所以这里就算没有用到self,self的引用计数也被加1了,这也说明并不是没显示的调用self就不会对其引用计数加1,这个错误真是让我郁闷了好久.接下来改正:[otherSelf
pushDNWWedViewController:otherSelf.thirdData.web_url];就OK了
@当然,还是得说明,如果你确定你的Block调用只是局部的或者不会发生循环引用的问题,那就不用考虑这些了.
@而我这个例子,changeViewBackGround这个Block是属性videoPlayView的属性,而videoPlayView又是self的属性,呗self持有,要等待self的释放才能释放,因为如果不用__block修饰,是一定会产生循环引用而导致内存泄露的问题
@最后套用一句:"具体问题具体分析啦!"
相关文章推荐
- 调用cvCreateFileCapture引起的内存泄露
- 依旧Block调用引起的内存泄露
- 依旧Block调用引起的内存泄露
- Handler 引起的内存泄露
- performSelector延时调用导致的内存泄露
- [转]performSelector延时调用导致的内存泄露
- 检测由new/delete使用不当引起的内存泄露
- Backtraces引起的内存泄露
- 【转】线程问题引起的内存泄露
- Javascript 闭包引起的IE内存泄露分析
- performSelector延时调用导致的内存泄露
- performSelector延时调用导致的内存泄露
- Wcf 调用 web 服务造成的内存泄露
- ss目前的设计有引起内存泄露而导致down机的隐患
- 关于SetTexture()调用引起显存泄露的问题
- ArrayList 与HashSet的比较,及应用反射读取properties配置文件中的数据进行实例化再调用,以及类加载器的使用;还有HashCode的分析,及导致内存泄露,内存溢出的原因之一
- 一对MS内存泄漏查找工具(Leakdiag和LDGrapher)和STL类跨DLL调用引起内存泄漏
- p重新调用多次new及delete的内存泄露问题
- [Silverlight入门系列]MEF引起的内存泄露
- 关于SetTexture()调用引起显存泄露的问题