我正在尝试调试我的应用程序。
我一直在我的非弧代码中使用一些 NSTimer 实例,如下所示(来自主线程):
[NSTimer scheduledTimerWithTimeInterval:5 target:musicPlayer selector:@selector(playPause:) userInfo:nil repeats:NO];
如果我将此代码分配给一个按钮并单击一个按钮,则效果很好。计时器启动。
我也尝试过:
if( self.deliveryTimer == nil)
{
self.deliveryTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(playPause:) userInfo:nil repeats:NO];
}
-(void)playPause:(NSTimer*)timer
{
[deliveryTimer invalidate];
deliveryTimer = nil;
//more code here
}
我希望计时器能够执行,点击下面的播放/暂停方法,然后转到 nil,这样我就可以稍后重置计时器。我检查 nil 的原因是因为我有 3 个不同的代码路径可以设置计时器。每一个都有一个 NSLog 语句,表明计时器已被调度。
我的代码运行,并且我看到计时器正在计划中,但它们似乎不会在正常应用程序执行过程中触发。我正在调查原因。短期定时器,使用相同的逻辑触发罚款。当我让应用程序运行一段时间时,我遇到了问题。
NSTimers 可以被 ARC 回收吗?
如果我从 PerformSelectorInBackground 设置计时器有什么关系吗?当我写这个问题时,我注意到我的一些计时器是从通过以下方式调用的代码路径创建的:
[self performSelectorInBackground:@selector(notifyDelegateOfDataPoint:) withObject:data];
后台选择器可能是我的计时器不触发/提前回收的原因吗?
感谢任何帮助,这个错误已经困扰我两个多星期了!
Update: 更改代码以使用主线程后对于 NSTimers 来说,计时器正确触发,使音乐播放:
[self performSelectorOnMainThread:@selector(deliverReminder:) withObject:nil waitUntilDone:NO];
-(void)deliverReminder:(id)sender{
[ NSTimer scheduledTimerWithTimeInterval:10 target:reminderDeliverySystem selector:@selector(playAfterDelay:) userInfo:nil repeats:NO];
[self postMessageWithTitle:nil message:@"Deliver Reminder Called" action:kNoContextAction];
}
-(void)playAfterDelay:(id)sender
{
int reminderDelay = reminder.delayValue.intValue;
[playTimers addObject:[NSTimer scheduledTimerWithTimeInterval:reminderDelay target:self selector:@selector(appMusicPlayerPlay:) userInfo:nil repeats:NO]];
}
这里我有一大堆计时器,这是因为我不知道如何使用选择器将原语传递给目标。