Не може да се обезсили (Стоп) NSTimer

Възможен дубликат:
NSTimer не спира

Използвам NSTimer, за да актуализирам стойността на плъзгач, докато се възпроизвежда аудио.

 if (sliderUpdateTimer) {
    [sliderUpdateTimer invalidate];
    sliderUpdateTimer=nil;
}

sliderUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSliderForAudio) userInfo:nil repeats:YES];

след като аудиото приключи с възпроизвеждането, правя невалиден метода на делегиране на таймера в audioPlayer.

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
NSLog(@"audioPlayerDidFinishPlaying");
[player release];
audioPlayer=nil;

[sliderUpdateTimer invalidate];
[sliderUpdateTimer release];
sliderUpdateTimer=nil;

}

Методът на делегата се извиква, но таймерът не спира.... Имам само веднъж нишка, в която стартирам таймера. Но въпреки това таймерът не спира.... Всяка помощ в това отношение е добре дошла...


person A for Alpha    schedule 02.02.2012    source източник
comment
Това е правилният начин за спиране на таймер, трябва да има нещо друго нередно. какво виждаш Все още ли се извиква функцията updateSliderForAudio? Как можете да разберете? Приложението се срива ли?   -  person Thomas Clayson    schedule 02.02.2012
comment
кой метод съдържа кода if (sliderUpdateTimer) { ...???   -  person Inder Kumar Rathore    schedule 02.02.2012
comment
Приложението не се срива. Но updateSliderForAudio се извиква непрекъснато дори след като таймерът е невалиден.... Инструкциите на регистрационния файл в метода се извикват дори след обезсилване на метода   -  person A for Alpha    schedule 02.02.2012


Отговори (3)


Първо, ще прекалите с освобождаването му и трябва да получите EXC_BADACCESS (не запазвате таймера, когато го настройвате, така че също не трябва да го освобождавате). Трябва да се обадите само:

[sliderUpdateTimer invalidate];
sliderUpdateTimer=nil;

Тъй като не получавате срив, изглежда sliderUpdateTimer е nil при извикване на audioPlayerDidFinishPlaying:. Потребете NSLog или поставете точка на прекъсване, за да проверите дали това е вярно. Ако случаят е такъв, вероятно го настройвате на нула в даден момент, потърсете slideUpdateTimer и проверете къде може да се случи това.

person alex-i    schedule 02.02.2012

Ей, пробвай това нещо...

- (void)stopTimer{
    [sliderUpdateTimer invalidate];
    //don't release it. as it is autoreleased.
    //[sliderUpdateTimer release];
    sliderUpdateTimer=nil;
}


-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    NSLog(@"audioPlayerDidFinishPlaying");
    [player release];
    audioPlayer=nil;
    [self performSelectorOnMainThread:@selector(stopTimer) withObject:nil waitUntilDone:NO];
}

Знам, че имате само една нишка, но може да има два различни цикъла на изпълнение

person Inder Kumar Rathore    schedule 02.02.2012

Опитайте, след като премахнете редовете по-долу от 1-ви раздел на вашия код

if (sliderUpdateTimer){
    [sliderUpdateTimer invalidate];
    sliderUpdateTimer=nil;
}

Не е необходимо да извиквате съобщение за освобождаване на този обект sliderUpdateTimer

Тъй като сте създали този обект с чакащо съобщение за автоматично освобождаване

Тук няма нужда да използвате тези редове.

Надявам се това да проработи.

person Kamar Shad    schedule 02.02.2012