的NSTimer不会停止的NSTimer不会停止(NSTimer doesn't stop)

2019-05-13 15:17发布

我有当其触发定时器viewWillAppear的方法被调用,当无效viewDidDisappear被调用的方法。 但是一定量的它是无效的,甚至后,定时器继续射击视图之间切换后。 有什么问题?

这里是我的代码:

NSTimer *timer;

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f
                     target: self
                     selector:@selector( timerAction )
                     userInfo:nil
                     repeats:YES];
}

-(void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [timer invalidate];
    timer = nil;
}

-(void) timerAction
{
    NSLog(@"timerAction");
}

Answer 1:

我应该已经通过保留它保持一个链接到计时器。 :)我问这个问题,4个月前,它是惊人的,多少经验,我获得的。 :)

timer = [ [NSTimer scheduledTimerWithTimeInterval: ...] retain];
...
...
[timer invalidate];
[timer release];


Answer 2:

这是一个绝对的解决方案。 的那些都不以上为我工作,所以我这样做,

要启动计时器,

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:NO];

计时器调用的方法,

-(void)timerMethod
{
    // do what you need to do

    if (needs to be called again) {

        [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:NO];        
    }
}

希望这可以帮助,



Answer 3:

由计时器调用的方法应具备的定义

- (void)methodName:(NSTimer *)aTimer;

这样的方法有哪些被解雇计时器的实例。 你正在做的方式,该方法不会知道定时器是否被认定无效或没有。

试着改变你的定时器初始化

timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f target: self selector:@selector(timerAction:) userInfo:nil repeats:YES]

并且该方法以

-(void) timerAction:(NSTimer *)aTimer{...}

希望帮助



Answer 4:

这可能不是问题,但你需要保留提及是从scheduledTimerWithInterval返回计时器:。 如果不这样做,你的指针计时器可能是由你去阻止它的时间无效。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    timer = [[NSTimer scheduledTimerWithTimeInterval:0.2f target:self selector:@selector(timerAction) userInfo:nil repeats:YES] retain];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [timer invalidate];
    [timer release];
    timer = nil;
    [super viewDidDisappear:animated];
}

- (void)dealloc
{
    [timer invalidate];
    [timer release];
    timer = nil;
    [super dealloc];
}

另外,尝试设置在viewDidDisappear一个断点,并确保它获取调用!



Answer 5:

**In .h class**

@interface 
{
NSTimer * theTimer;

}


**in .m class**

//put this code where you want to calling the NSTimer function

        theTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:) userInfo:nil repeats:YES];



- (void)updateCounter:(NSTimer *)theTimer 
{

   // write your code here for counter update 

}


// put this code to Stop timer:

    [theTimer invalidate];
    theTimer = nil;


Answer 6:

这奏效了我在斯威夫特

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    dispatch_async(dispatch_get_main_queue(),{ [weak self] in

        self?.idleTimer?.invalidate()
        self?.idleTimer = nil

    })

}


Answer 7:

你已经忘记释放定时器viewWillDisappear:

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [timer invalidate];
    [timer release];
    timer = nil;
}

这应该不会导致定时器虽然保持射击...



Answer 8:

invalidate的DOCO说

“运行循环中删除并释放定时器,要么只是该无效方法返回之前或在以后的某个点。”

我想你在以后的某个点得到清除。



Answer 9:

我有同样的问题。

我不能dealloc的我来说,如果计时器仍在运行,所以我打电话之前停止它:

- (void)stopTimer
{
    [timer invalidate];
    [timer release];
    timer = nil;
}

调用此方法后我真的计时器停止



Answer 10:

- (void)viewWillAppear:(BOOL)animated被再次调用。

事实上,它被调用每次切换视图或您关闭一个模式的看法后的时间。 基本上,你的观点实际上会重新出现在屏幕上的任何时候,不只是第一次。

因此,在这种情况下,定时器被重新启动,即使是之前无效。



Answer 11:

创建计时器后刚刚注册它在运行NSRunLoopCommonModes

[[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSRunLoopCommonModes];

然后, invalidate的方法会奏效。



Answer 12:

这对我的作品

dispatch_async(dispatch_get_main_queue(), ^{
    [timer invalidate];
});


文章来源: NSTimer doesn't stop