我添加这样的计时器
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(), ^{})
它也不会停止计时器。
答案 0 :(得分: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
}
答案 1 :(得分:4)
阅读NSTimer的文档:
创建计时器有三种方法:
使用scheduledTimerWithTimeInterval:invocation:repeats:或scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:class方法创建计时器并在默认模式下在当前运行循环上安排它。
使用timerWithTimeInterval:invocation:repeats:或timerWithTimeInterval:target:selector:userInfo:repeats:class方法创建计时器对象而不在运行循环上安排它。 (创建它之后,必须通过调用相应NSRunLoop对象的addTimer:forMode:方法手动将计时器添加到运行循环中。)
- 醇>
分配计时器并使用initWithFireDate初始化它:interval:target:selector:userInfo:repeats:method。 (创建它之后,必须通过调用相应NSRunLoop对象的addTimer:forMode:方法手动将计时器添加到运行循环中。)
您使用的方法已经将其从1添加到mainLoop。 - 您需要删除此行或使用2.方法创建计时器并保留手动添加。
另请记住,您必须从安装了计时器的线程发送无效消息。如果从另一个线程发送此消息,则与该计时器关联的输入源可能不会从其运行循环中删除,这可能会阻止该线程正常退出。
答案 2 :(得分:0)
我已经尝试了找到的所有可能的解决方案,但最终无法解决这个问题,我在初始化如下定时器时设置了重复“假”
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)
}
}
希望这能解决您的问题。
快乐编码:)