NSTimer не станет недействительным

-(IBAction) loadWeb: (id) sender {

     [_webView loadRequest:nsrequest2];
     _webView1.hidden = YES;
     _webView.hidden = NO;

     self.checkForAdd = [NSTimer scheduledTimerWithTimeInterval:0.4 
         target:self selector:@selector(checkForAddToCart:) userInfo:nil 
         repeats:YES];
}

-(IBAction)button1:(id)sender {
    [self.checkForAdd invalidate];
}

Как мне аннулировать timer? Я пробовал без self и многими другими способами, но почему-то при нажатии на кнопку таймер не срабатывает.


person user3155477    schedule 12.01.2014    source источник
comment
Метод loadWeb: вызывается несколько раз? Используется ли self.checkForAdd где-нибудь еще?   -  person Wain    schedule 12.01.2014
comment
Поместите NSLog в loadWeb и button1, а в button1 запишите значение checkForAdd. Скорее всего, вы обнаружите, что либо loadWeb вызывается больше раз, чем button1, либо что button1 имеет значение nil.   -  person Hot Licks    schedule 12.01.2014


Ответы (2)


Проверьте, вызывается ли loadWeb: несколько раз. Если это так, у вас будут работать старые таймеры без ссылки на них, поэтому вы не сможете сделать их недействительными. Перед созданием нового таймера у вас должно быть [self.checkForAdd invalidate];.

Когда вы делаете invalidate таймер, если вы не создаете новый, установите self.checkForAdd = nil;, чтобы быть уверенным, что вы не собираетесь снова пытаться использовать таймер (некоторые действия вызовут исключение, если вы это сделаете).

Если в какой-то момент вы сделаете self.checkForAdd = nil;, не имея invalidated таймера, то у вас не будет ссылки на него, поэтому вы не сможете invalidate сделать это в будущем.

person Wain    schedule 12.01.2014

Согласно вашему коду, loadWeb запускается кнопкой. Таким образом, вы будете создавать новый таймер каждый раз, когда будет нажата кнопка. Лучше создать таймер в другом месте, например, в init или в методе viewDidLoad, потому что, если вы создаете это здесь, вы должны убедиться, что вы не создаете таймер снова и снова. Вы можете сделать это, выполнив if проверку

if(!self.checkForAdd){
self.checkForAdd = [NSTimer scheduledTimerWithTimeInterval:0.4 
         target:self selector:@selector(checkForAddToCart:) userInfo:nil 
         repeats:YES];
}

Прямо сейчас он создает новый таймер при нажатии кнопки, а предыдущий не имеет ссылки.

person Adnan Aftab    schedule 12.01.2014