Остановить NSTimer в UIPopover - PullRequest
       13

Остановить NSTimer в UIPopover

0 голосов
/ 08 октября 2011

Итак, у меня есть UIPopover с NSTimer. У него есть различные BOOLS и свойства, позволяющие создавать другие методы, но это сейчас не важно. То, что я хочу знать, есть ли способ освободить и сделать недействительным таймер, когда родительское представление всплывающего окна исчезло? Я попробовал методы класса, чтобы сделать недействительным и освободить таймер, но они дали мне предупреждения SIGABRT и EXC_BAD_ACCESS. Я думаю, что это как-то связано с таймером, который должен сообщать dealloc, когда он уже равен нулю.

Пара дополнительных факторов: 1. Таймер должен оставаться в силе и распределяться, когда всплывающее окно отклоняется. 2. Таймер должен сделать недействительным и освободить, когда родительское представление исчезло.

Есть предложения?

КОД:

//@interface
    NSTimer *clickTimer;
@property (nonatomic, retain) NSTimer *clickTimer;

//.m
- (IBAction)clickerPressed:(id)sender
{
if ([click isClicking] == YES) {
    [clickTimer invalidate];
    [clickTimer release];
    clickTimer = nil;
    // enable the idle timer when the clicking is turned off
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
    [click setIsClicking:NO];
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal];
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal];
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]];
    [click setClickCount:0];

} 
else {
    // disable the idle timer while the metronome is clicking.
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
    [click setIsClicking:YES];
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal];
    [clickerButton setTitle:@"Stop" forState:UIControlStateNormal];
    [[NSThread currentThread] setThreadPriority:1.0];

    clickTimer = [[NSTimer scheduledTimerWithTimeInterval:[click clickRateInSeconds] target:self selector:@selector(click:) userInfo:nil repeats:YES]retain];
    }

}

1 Ответ

2 голосов
/ 08 октября 2011

Освобождение объекта не присваивает ноль указателю автоматически.Добавьте clickTimer = nil; после вашего заявления о выпуске.Это предотвратит доступ другого метода к недопустимому объекту, если он попытается освободить clickTimer .

. Чтобы все ваши методы правильно установили clickTimer в nil , вы можете подумать о создании метода, который делает недействительным таймер, вместо того, чтобы каждый метод делал недействительным таймер:

- (void) invalidateClickTimer
{
    // invalidate timer
    if (clickTimer == nil)
        return;
    [clickTimer invalidate];
    [clickTimer release];
    clickTimer = nil;

    // stop clicking
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
    [click setIsClicking:NO];
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal];
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal];
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]];
    [click setClickCount:0];
    return;
}

Затем замените следующие строки в - (IBAction)clickerPressed:(id)sender

if ([click isClicking] == YES) {
    [clickTimer invalidate];
    [clickTimer release];
    clickTimer = nil;
    // enable the idle timer when the clicking is turned off
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
    [click setIsClicking:NO];
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal];
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal];
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]];
    [click setClickCount:0];
}

С этой строкой:

if ([click isClicking] == YES) {
    [self invalidateClickTimer];
}

Вызовите новый метод - (void) invalidateClickTimer из UIViewController родительского представления.Вероятно, в методе - (void)viewWillDisappear:(BOOL)animated

...