iOS5 ARC可以安排从后台select器安排NSTimers吗?

我正在尝试debugging我的应用程序。

我在我的非弧代码中使用了一些NSTimer实例(从主线程):

[NSTimer scheduledTimerWithTimeInterval:5 target:musicPlayer selector:@selector(playPause:) userInfo:nil repeats:NO]; 

这工作正常,如果我将此代码分配给一个button,然后单击一个button。 定时器启动。

我也试过:

  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的原因是因为我有3个不同的代码path,可能会设置计时器。 每个人都有一个NSLog语句指出计时器已经被调度。

我的代码运行,我看到计时器正在计划,但他们似乎并没有在正常的应用程序执行过程中触发。 我正在调查为什么。 短期定时器,使用相同的逻辑火罚款。 当我让应用程序运行一段时间,我遇到了问题。

NSTimers可以被ARC收回吗?

如果我从performSelectorInBackground设置计时器,这有什么关系吗? 当我写这个问题的时候,我注意到我的一些定时器是通过被调用的代码path创build的:

 [self performSelectorInBackground:@selector(notifyDelegateOfDataPoint:) withObject:data]; 

背景select器是否可以成为我的计时器之前不会触发/恢复的原因?

任何帮助表示赞赏,这个bug已经扰乱了我超过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]]; } 

在这里,我有一大堆定时器,这是因为我不知道如何通过select器将一个原语传递给目标。

一个NSTimer需要一个运行循环在后台线程中运行,以便继续运行。 主线程已经有一个活动的运行循环,这就是为什么你的计时器在执行时可以正常工作。

如果你想在后台线程中使用你的定时器,你可以做如下的事情:

 NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; self.deliveryTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(playPause:) userInfo:nil repeats:NO]; [runLoop run]; 

你的短时间计时器可能发生了什么事情,但是更长的时间计时器没有发生,就是他们在线程仍然活动时触发,但没有运行循环继续执行,线程到达执行结束后失败。

我不相信这是与ARC相关的,尽pipe可能有些东西需要注意,因为NSRunLoop会持有与其相关的计时器。 按照NSTimers的标准程序应该避免ARC问题。