NSTimer没有停止?

时间:2012-06-24 19:09:07

标签: iphone xcode nstimer nsrunloop

我试图使用以下代码停止NSTimer:

- (void)viewDidLoad
{
    [super viewDidLoad];
    timer3 = [NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(start) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:timer3 forMode:NSDefaultRunLoopMode];
}

-(void)invalidate
{  
    [timer3 invalidate];
    timer3 = nil; 
}

我从另一个类中调用-(void)invalidate

-(void)timer
{
    ClassOfMyTimer *class = [[ClassOfMyTimer alloc] init];
    [class invalidate];
}

但计时器不会停止。有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:4)

您需要在创建计时器的类的同一实例上调用invalidate方法。在您的timer方法中,您创建了一个类的新实例,该实例可能有自己的计时器并使其无效。

答案 1 :(得分:1)

我对你在这里尝试做的事感到困惑,但我猜你没有保留对timer3的引用。

您是否在.h文件中为计时器创建了一个属性:

@property (strong) NSTimer *timer3;

然后在.m文件中添加了一个合成语句:

@synthesize timer3;

然后,在viewDidLoad:中,您可以通过以下方式维护对正在创建的计时器的引用:

self.timer3 = [[[NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(start) userInfo:nil repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:self.timer3 forMode:NSDefaultRunLoopMode];

并且,稍后使计时器无效:

[self.timer3 invalidate]
self.timer3 = nil

在预览中,Sven还有一个有效的解决方案来解决可能影响你的问题..