iOS 视图控制器在退出的时候没有走dealloc,你需要做的事情
2015-11-12 10:41
225 查看
这几天由于前台的ui没有给我图,所以有点闲,我一直在纠结内存优化的问题。
我昨天发现我的导航控制器在pop的时候居然没有走dealloc方法,我在leaks里面去运行,也没有发现内存泄漏的提示。但是作为一个合格的程序员一定不能允许出现这种情况。所以我开始 一步一步的查询。
归根结底,是因为当前控制器被某个对象强引用在控制器pop的时候count没有减为0,导致控制器的引用计数不为0,系统无法帮你释放这部分内存。
我控制器里面有通知,块比较是容易导致强引用,所以我就在这里面一句一句的去检查,结果在块里面发现了问题。我在块里面有一个地方居然调用self没有用他的弱引用形式,所以导致了self的count加一,最后直接导致控制器在pop的时候没有走dealloc这个方法。
总结了一下控制器被强引用不走dealloc的原因无非就是三中情况:
一.block块使用不当。因为block会对方法中的变量自动retain一次。请检查控制器中block代码。(我的就是因为这没有走dealloc)
二.NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁。
三.控制器中的代理属性一定要是弱引用,不要强引用。
我昨天发现我的导航控制器在pop的时候居然没有走dealloc方法,我在leaks里面去运行,也没有发现内存泄漏的提示。但是作为一个合格的程序员一定不能允许出现这种情况。所以我开始 一步一步的查询。
归根结底,是因为当前控制器被某个对象强引用在控制器pop的时候count没有减为0,导致控制器的引用计数不为0,系统无法帮你释放这部分内存。
我控制器里面有通知,块比较是容易导致强引用,所以我就在这里面一句一句的去检查,结果在块里面发现了问题。我在块里面有一个地方居然调用self没有用他的弱引用形式,所以导致了self的count加一,最后直接导致控制器在pop的时候没有走dealloc这个方法。
总结了一下控制器被强引用不走dealloc的原因无非就是三中情况:
一.block块使用不当。因为block会对方法中的变量自动retain一次。请检查控制器中block代码。(我的就是因为这没有走dealloc)
二.NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁。
三.控制器中的代理属性一定要是弱引用,不要强引用。
相关文章推荐
- iOS 把数组里的所有数据取出到一个字符串中
- iOS 静态库.a文件的制作
- iOS 应用程序内部国际化,不跟随系统语言
- iOS中block实现的探究
- iOS开发零基础教程之Xcode Could ont lauch "XXX" process launch failed:security
- TYAttributedLabel——简单,强大的iOS属性文本控件
- iOS处理图片的一些小Tips
- YYWebImage——iOS异步图片加载框架
- iOS CoreAnimation动画系列教程
- IOS Quartz 各种绘制图形用法---实现画图片、写文字、画线、椭圆、矩形、棱形等
- 整理 iOS 9 适配中出现的坑(图文)(转)
- 一个底部弹出Popwindow的效果(类似Ios)
- ios 精确的货币计算
- iOS_NSAttributedString 的21种属性详细介绍(图文混排)
- iOS开发工具
- iOS应用逆向工程(四):利用Cycript 操作运行时
- iOS 各种bar的隐藏
- 芒果iOS开发之格式转化符总结
- ios开发证书CER文件、P12文件,mobileprovition许可文件的用途
- 图片点击放大,再次点击返回原视图.完美封装,一个类一句代码即可调用.IOS完美实现