继博客 iOS内存话题: performSelector 导致不立即 dealloc, 今天讨论一下 NSTimer 导致内存无法释放的问题.
直接上例子.
例子下载地址:http://download.youkuaiyun.com/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 开发者来说, 这个的确不是什么"大问题".
但是, 当你的代码量大了, 去排除问题的时候, 你不一定会注意到这个问题的存在.
共勉!