问题:viewController不会调用dealloc()不会销毁
来源:互联网 发布:ubuntu 画图工具 编辑:程序博客网 时间:2024/04/30 09:41
问题
在调试程序时,我从ViewController A push进 ViewController B,在从B back时发现程序不会执行B里面的dealloc(),很诡异的问题,因为按理说此时点击back是执行pop操作的,是会执行dealloc()函数的,但经调试发现确实没有执行。所以viewController也就不会销毁.
原因
The dealloc method was not being called if any of the references held by a viewcontroller were still in memory. 也就是说,我当前View B 内存中计数器不为0,还有一些内容的引用计数不为0, 所以造成了 controller 不能及时释放.
解决
我发现在我的代码里有一个倒计时的计时器的功能, 是通过 NSTimer实现的,
在调用的时候对 target:self 进行了retain, 这时候你pop回上一级,self的引用计数还剩1,所以肯定不会dealloc. 当其倒计时结束后, 我有一个[timer invalidate]的方法, 这个时候才会调用 dealloc.
所以我的解决办法是在viewWillDisappear: 方法中执行[timer invalidate];这样,self view计数器为0,当前view就会自动调用delloc()。
总结
其实这个问题, 就跟循环引用的问题是类似的, 都是由于内存考虑不周全管理不当造成的. 但是很多时候都会出现, 尤其是在 NSTimer , block , delegate, 使用的时候, 很容易造成当前页面不能及时销毁, 从而导致内存泄露. timer 一定要及时invalidate, block 要用 copy修饰而且还有防止析构和 block块内的循环引用, delegate 要用assign 修饰. 等等都需要好好注意.
推荐文章: block 用法详解及注意事项, 错误:Failed to locate or generate matching signing assets
- 问题:viewController不会调用dealloc()不会销毁
- viewcontroller加了NSTimer后,dealloc方法不会调用
- viewController被POP后不调用dealloc的问题
- Unity3D关于Destroy不会立即销毁的问题
- 关于onServiceDisconnected不会被调用的问题
- iOS viewcontroller中的dealloc方法不调用
- 直接把ViewController的view 通过addSubview添加到另一个View,则不会调用viewDidAppear
- UIAlertView点击按钮不会销毁自身View
- 不会的问题
- 问题不会自己解决
- 不会的问题
- 小金问呀问不会问题
- cocos2d-x3.2触屏问题,不会调用onTouchBegan
- ViewGroup为什么不会调用onDraw
- ViewGroup为什么不会调用onDraw
- ViewGroup为什么不会调用onDraw
- ViewGroup为什么不会调用onDraw
- ViewGroup为什么不会调用onDraw
- 信号量、互斥体和自旋锁
- iOS CocoaPods之 Pods 制作(新版方式)
- 安凯AK3918E加载mtk7601驱动不能ifconfig wlan0 down
- java垃圾回收机制
- 封装CLLocationManager定位获取经纬度
- 问题:viewController不会调用dealloc()不会销毁
- Leetcode no. 51
- Android中Button自定义外观-按下与放开时不同背景
- iOS Block的基本使用以及Block传值
- 山寨web服务器
- 分布式事务操作之Spring+JTA+mybatis
- java.lang.NumberFormatException: For input string: "on"
- vs开发工具一个统计行数的正则使用方法
- 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误