当我不创建NSTimer对象时,如何使计时器无效

时间:2012-08-30 07:03:31

标签: ios nstimer

我不想创建NSTimer对象。如何使计时器无效?我想在viewWillDisappear中使计时器无效。

-(void) viewDidLoad
{ 
 [super viewDidLoad];
 [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
}

4 个答案:

答案 0 :(得分:3)

<强> A

你必须坚持你创建的计时器:

@interface MONObject ()
@property (nonatomic, retain) NSTimer * timerIvar;
@end

@implementation MONObject
...
- (void)viewDidLoad
{ 
 [super viewDidLoad];
 self.timerIvar = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
}

- (void)invalidateTimer
{
  [self.timerIvar invalidate];
  self.timerIvar = nil;
}

- (void)viewWillDisappear:(BOOL)animated
{
  ...
  [self invalidateTimer];
}

<强>乙

另一种选择是使回调中传递的计时器无效,但在viewDidUnload:内不会发生。因此,它并不适用于这种情况:

- (void)onTimer:(NSTimer *)pTimer
{
  [pTimer invalidate];
}

答案 1 :(得分:1)

如果你想取消定时器,你必须参考你要取消的定时器,这意味着你必须将指针指向定时器,请参阅justin的答案。

保持对计时器的引用是正确的方法,但为了完整起见,您也可以使用-performSelector:withObject:afterDelay:方法作为穷人的计时器。该呼叫可能会使用+cancelPreviousPerformRequestsWithTarget:无效。示例代码:

- (void) viewDidLoad
{
    [super viewDidLoad];
    [self performSelector:@selector(timerTick) withObject:nil afterDelay:10];
}

然后:

- (void) viewWillDisappear
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [super viewWillDisappear];
}

但这不是正确的方法,因为您可能会取消对象上待处理的其他执行选择器请求。最好保持你的计时器,这样你就可以确切知道你要取消的东西了。

顺便说一句,在-viewDidLoad中运行计时器也是一个坏主意。视图加载可能随时发生,与视图的显示没有任何关系。

答案 2 :(得分:0)

也许这种方法可以帮到你:

[self performSelector:@selector(onTimer:) withObject:nil afterDelay:10];

答案 3 :(得分:0)

如果您不想保留计时器,NSTimer对象将被传递给计时器方法(在您的情况下是onTimer :),因此在该方法中您可以检查是否仍需要计时器并使其无效。但是,如果视图在您使计时器无效之前返回,并且您创建了一个新计时器,则会遇到麻烦。

到目前为止,最好的方法是将计时器存储到实例变量中。它有效,没有巧妙的技巧,六个月后你会知道你做了什么。我可能会写一个

@property (readwrite, nonatomic) BOOL hasTimer;

getter返回YES如果计时器不为nil,则setter使计时器无效或创建一个新计时器。