这是我的示例代码..我有定时器每秒触发功能"调用"。
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(call:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"sdfsf",@"wsdf", nil] repeats:YES];
-(void)call :(NSTimer *)timer{
NSLog(@"called outside %@",timer.userInfo);
static dispatch_once_t myDisPatch;
dispatch_once(&myDisPatch, ^{
NSLog(@"called inside");
});
}
我怀疑的是,当我们改变"静态dispatch_once_t myDisPatch"进入" dispatch_once_t myDisPatch"。然后计时器自动无效。它不会再次调用该功能。为什么当我从dispatch_once_t中删除static关键字时会发生这种情况?为什么它会停止计时器?提前谢谢。
答案 0 :(得分:1)
static dispatch_once_t myDisPatch;
dispatch_once(&myDisPatch, ^{
NSLog(@"called inside");
});
这是通常用于单身人士的代码,以确保它只执行一次。当您删除static
时,它可以执行多次,这就是它的工作原理。你根本不应该使用它来重复计时器。
因此,对于静态,你会每秒看到“被叫外部”,但“被叫内部”只有一次。这并不意味着计时器停止了。
答案 1 :(得分:1)
代码没有停止你的计时器。相反,当你删除静态关键字时,它会阻塞等待陷阱中的主线程(它永远停留在这里)。
当您希望触发计时器时,单击调试器中的暂停,您将看到堆栈跟踪。
如果您不想使用静态调度令牌,请为其指定值0(不确定为什么您实际上还需要dispatch_once)
dispatch_once_t myDisPatch = 0;
dispatch_once(&myDisPatch, ^{
NSLog(@"called inside");
});