您的位置:首页 > 移动开发 > IOS开发

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

#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 开发者来说, 这个的确不是什么"大问题".

但是, 当你的代码量大了, 去排除问题的时候, 你不一定会注意到这个问题的存在.

共勉!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: