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

本文通过一个具体的iOS应用实例,探讨了使用NSTimer时可能遇到的内存管理问题。特别是当ViewController消失时,若未正确取消NSTimer,会导致内存无法正常释放。文章提供了问题的解决方案,并强调了在大型代码库中排查此类问题的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

共勉!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值