【问题标题】:Weird behavior of NSTimer in classNSTimer 在课堂上的奇怪行为
【发布时间】:2013-03-19 22:05:21
【问题描述】:

我有一个真正奇怪的 NSTimer 对象行为。

我正在尝试以 2 秒的重复计数调用 ChangePic 方法,但计时器没有重复。我有这个问题仅在项目中的 1 个班级

我的应用中有 5 个视图控制器,除了这个之外,相同的代码适用于所有类。 有人知道怎么可能吗?有没有可能是什么东西阻塞了计时器?

-BTW,ChangePic 方法只调用一次,不重复。

我的代码:

ViewController.h

@property (nonatomic, strong) NSTimer *timer;

ViewController.m

_timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(ChangePic) userInfo:nil repeats:YES];
[_timer fire];

-(void) ChangePic {
    NSLog(@"testing"); 
}

【问题讨论】:

  • 我将代码完全复制并粘贴到项目中,并且运行良好。你应该搜索我认为的代码其他部分的错误
  • P.S.无需拨打fire,定时器会立即启动。
  • 我不认为问题出在您发布的代码中。看看别处。 ChangePic() 是触发一次还是根本不触发?

标签: ios objective-c nstimer repeat


【解决方案1】:

将其分配给属性而不是支持变量。

self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(ChangePic) userInfo:nil repeats:YES];

【讨论】:

  • 这与问题无关。使用 ARC,分配给 _timerself.timer 是一回事(内存管理方面)。
  • 问题中没有提到 ARC。
  • 当然有。查看属性声明。它使用strong,而不是retain
  • 我同意这可能不是问题,但它仍然是个好建议。也许这应该是一个评论。
  • 这与这个问题无关。除非您打算在某处使用该变量,否则您根本不需要将计时器分配给任何东西。
【解决方案2】:

鉴于没有给出很多背景信息,很难准确地说出您的问题。我可以告诉你,我回答了另一个问题,问题是其中一个视图阻塞了计时器。定时器可以在多种不同的模式下运行,不同的场景有时会导致定时器被阻塞。尝试将计时器添加到所有常见模式,如下所示:

[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];

另外,就像@Hejazi 所说,删除“fire”方法调用。在预定的计时器上不需要它。

【讨论】:

  • 我试过了,也没有用。我还尝试从当前 ViewController 中删除所有视图,它也有同样的问题。顺便说一句,当我删除 fire 方法时,>ChangePic
  • 那么我同意@MarcusAdams,问题一定出在其他地方。您可以发布此视图控制器创建或使用的任何位置的代码供我们查看,或者您可以开始设置断点并检查此视图控制器的值和计时器属性以确保它们不会得到 nil' d 在任何时候。显然其他地方存在问题,因为您提到没有“fire”方法,它根本不会被调用。情况不应该如此。 scheduleTimer... 方法应该自动启动计时器。这是一个很好的指标,表明有些地方不合适。
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多