iOS内存话题: NSTimer 导致无法 dealloc

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

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

共勉!



©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页