Цель C: Таймер вылетает из приложения при повторном включении - PullRequest
2 голосов
/ 31 марта 2011

Мой NSTimer объявлен в заголовочном файле. При нажатии кнопки play таймер включается. Следующее нажатие отключает таймер. При третьем касании происходит сбой приложения без сообщения об ошибке. Почему это происходит?

-(IBAction) play {

if ([col1 isValid]) {
    [col1 invalidate];
} else {
    col1 = [NSTimer scheduledTimerWithTimeInterval:.8 target:self selector:@selector(playCol1) userInfo:nil repeats:YES];
}

Ответы [ 2 ]

4 голосов
/ 31 марта 2011

invalidate приведет к освобождению объекта. Итак, вы пытаетесь позвонить isValid по неверной ссылке. обнулите объект col1 после того, как вы его аннулируете, и все будет в порядке.

-(IBAction) play {

    if ([col1 isValid]) {
        [col1 invalidate];
        col1 = nil;
    } else {
        col1 = [NSTimer scheduledTimerWithTimeInterval:.8 target:self selector:@selector(playCol1) userInfo:nil repeats:YES];
}
2 голосов
/ 31 марта 2011

Сбой из-за того, что он пытается invalidate уже аннулированный таймер col1.

Вы пробовали [col1 isValid]==YES?Попробуйте, и если это не сработает, попробуйте использовать пользовательский флаг типа integer или BOOL.

У меня была похожая проблема с методом isValid, и я нашел обходной путь, используяфлаг типа BOOL

Надеюсь, это поможет вам.

ОБРАЗЕЦ ИСПОЛЬЗОВАНИЯ ТАМОЖЕННЫХ ФЛАГОВ:

 BOOL invalidateTimer = NO; 
-(IBAction) play 
{
     if (invalidateTimer == YES) 
     {
                 [col1 invalidate];
     }
     else if (invalidateTimer == NO)
     {
           col1 = [NSTimer scheduledTimerWithTimeInterval:.8 target:self selector:@selector(playCol1) userInfo:nil repeats:YES];
           invalidateTimer = YES;
     }
} 
...