6

我像这样添加计时器

tim=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeatTim) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:tim forMode:NSDefaultRunLoopMode];

tim它是我班​​级的 NSTimer 属性。

然后我在按钮点击时停止它

[[fbt tim] invalidate];
[fbt setTim:nil];

fbt 它是我班​​级的实例。

如果我只调用 invalidate 那么它不会停止,但如果我将它设置为 nil 然后我得到 EXC_BREAKPOINT

这里是选择器中 repeatTim 方法的代码

AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
[appDelegate.wbv stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"intal()"]];

我试图调用init并使其无效

dispatch_async(dispatch_get_main_queue(), ^{})

它也不会停止计时器。

4

3 回答 3

5

您有不止一个计时器正在运行。尝试这个:

-(void)startTimer{
    [self.myTimer invalidate]; // kill old timer
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
}

-(void)stopTimer{
    [self.myTimer invalidate];  
    self.myTimer=nil; //set pointer to nil 
}
于 2016-04-10T15:25:47.323 回答
4

阅读 NSTimer 的文档:

创建定时器的三种方法:

  1. 使用 scheduleTimerWithTimeInterval:invocation:repeats: 或 scheduleTimerWithTimeInterval:target:selector:userInfo:repeats: 类方法创建计时器并在默认模式下将其安排在当前运行循环中。

  2. 使用 timerWithTimeInterval:invocation:repeats: 或 timerWithTimeInterval:target:selector:userInfo:repeats: 类方法来创建计时器对象,而无需在运行循环中调度它。(创建完成后,你必须通过调用相应 NSRunLoop 对象的 addTimer:forMode: 方法手动将定时器添加到运行循环中。)

  3. 分配计时器并使用 initWithFireDate:interval:target:selector:userInfo:repeats: 方法对其进行初始化。(创建完成后,你必须通过调用相应 NSRunLoop 对象的 addTimer:forMode: 方法手动将定时器添加到运行循环中。)

您正在使用已将其从 1 添加到 mainLoop 的方法。 - 您需要删除此行或使用 2. 方法创建一个计时器并保留手动添加。

还要记住,您必须从安装了计时器的线程发送无效消息。如果您从另一个线程发送此消息,则与计时器关联的输入源可能不会从其运行循环中删除,这可能会阻止线程正确退出。

于 2013-09-11T15:30:29.767 回答
0

我已经尝试了所有可能的解决方案,但最终无法解决我在初始化计时器时设置了重复“false”,如下所示

self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(viewcontroller.methodname), userInfo: nil, repeats: false)

并且需要在我的选择器方法中添加上面的行,以满足我想要重复时间的任何条件。

例如:-我的要求是我想重复调用某个方法,直到满足一个条件。因此,我没有添加重复 true,而是将其设置为 false,因为在我的情况下,repeat true 不会使计时器无效。

我在 viewdidload 方法中添加了以下内容

self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(viewcontroller.method), userInfo: nil, repeats: false)

在选择器功能中,我添加了以下代码:-

func method{
   if condition matched{
        // here your timer will be invalidated automatically
   }
   else{
       self.timer = Timer.scheduledTimer(timeInterval: 1, target: self,selector: #selector(viewcontroller.method), userInfo: nil,repeats: false)
   }
}

希望这能解决您的问题。

快乐编码:)

于 2021-02-09T14:53:48.300 回答