iOS内存话题: NSTimer 导致无法 dealloc
2016-04-10 22:30
513 查看
继博客 iOS内存话题: performSelector 导致不立即 dealloc, 今天讨论一下 NSTimer 导致内存无法释放的问题.
直接上例子.
例子下载地址:http://download.csdn.net/detail/androidbluetooth/9486863
ViewController 中打开另一个 ViewController(LoginPage).
LoginPage.m
代码很好理解.
NSTimer 每 1s 执行 goLogin 方法.
期望, 在 LoginPage 关闭的时候, 调用 dealloc 方法.
结果, 没有调用.
解决方法, 增加下面的一个方法.
到这里, 或许你会觉得这个很容易发现的问题了.
对于有经验的 iOS 开发者来说, 这个的确不是什么"大问题".
但是, 当你的代码量大了, 去排除问题的时候, 你不一定会注意到这个问题的存在.
共勉!
直接上例子.
例子下载地址:http://download.csdn.net/detail/androidbluetooth/9486863
ViewController 中打开另一个 ViewController(LoginPage).
LoginPage.m
#import "LoginPage.h" @interface LoginPage () @property (strong, nonatomic) IBOutlet UILabel *counterLabel; @property (strong, nonatomic) NSTimer *timer; @property (assign, nonatomic) int counter; - (void)goLogin; @end @implementation LoginPage - (void)dealloc { NSLog(@"LoginPage: dealloc"); } - (void)viewDidLoad { [super viewDidLoad]; _counter = 0; _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(goLogin) userInfo:nil repeats:YES]; } - (void)goLogin { NSLog(@"LoginPage: goLogin."); self.counter ++; self.counterLabel.text = [NSString stringWithFormat:@"%i", self.counter]; } @end
代码很好理解.
NSTimer 每 1s 执行 goLogin 方法.
期望, 在 LoginPage 关闭的时候, 调用 dealloc 方法.
结果, 没有调用.
解决方法, 增加下面的一个方法.
- (void)viewDidDisappear:(BOOL)animated { if (nil != _timer) { [_timer invalidate]; _timer = nil; } }
到这里, 或许你会觉得这个很容易发现的问题了.
对于有经验的 iOS 开发者来说, 这个的确不是什么"大问题".
但是, 当你的代码量大了, 去排除问题的时候, 你不一定会注意到这个问题的存在.
共勉!
相关文章推荐
- IOS Animation-动画基础、深入
- iOS NSRunloop 详解
- iOS开发之 用第三方类库实现ScrollView
- iOS微博授权登录及获取用户数据的方法
- 关于TextView的一个demo
- iOS学习路线图上
- iOS 单例模式范例
- iOS 属性修饰符记录 --不定时更新
- iOS typedef NS_ENUM 与 NSString
- ios程序后台继续运行
- CALyer
- ios拨打电话
- ios开发去掉首位空格
- iOS SDk开发之二
- iOS多线程开发系列之(三)Grand Central Dispatch(GCD)
- IOS开发 应用程序图标数字角标
- 数据存储封装—支持内存和本地缓存
- iOS开发-支付宝
- 【iOS】3D Touch
- iOS内存管理机制解析之MRC手动引用计数机制