NSTimer не останавливается?

Я пытаюсь остановить 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];
}

но таймер не останавливается. Кто-нибудь знает, что я делаю неправильно?


person XcodeMania    schedule 24.06.2012    source источник


Ответы (2)


Вам нужно вызвать метод invalidate для того же экземпляра вашего класса, который создал таймер. В вашем методе timer вы создаете новый экземпляр своего класса, который может иметь собственный таймер и делает его недействительным.

person Sven    schedule 24.06.2012

Меня немного смущает то, что вы пытаетесь здесь сделать, но я предполагаю, что вы не поддерживаете ссылку на 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

В предварительном просмотре у Свена также есть действительное решение проблемы, которая может повлиять на вас.

person Jeff Hellman    schedule 24.06.2012