【发布时间】:2011-11-09 05:09:09
【问题描述】:
我正在尝试调试我的应用程序。
我一直在我的非弧形代码中使用一些 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];
背景选择器可能是我的计时器没有更早触发/回收的原因吗?
感谢您的帮助,这个错误已经困扰我超过 2 周了!
更新:将代码更改为使用 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]];
}
这里我有一大堆计时器,这是因为我不知道如何使用选择器将原语传递给目标。
【问题讨论】:
-
是 all 计时器显然未能触发,还是只是一些?他们的火法还有什么?如果计时器被安排在后台线程上,它也会在该线程上触发,这可能会导致奇怪的事情发生。
-
所有通过 performSelectorInBackground 调度的定时器行为不一致。我听过他们玩过几次,但大多数时候,他们只是失败了。我什至没有收到 NSLog 消息或控制台更新。你对奇怪的事情是正确的,这准确地描述了我所经历的。
标签: objective-c ios ios5 nstimer automatic-ref-counting