cancelPreviousPerformRequestsWithTarget не работает в dealloc - PullRequest
2 голосов
/ 25 октября 2011
-(IBAction)voiceBroadcast
{

    if ([audioPlayer isPlaying]) {
        [audioPlayer stop];
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
    }


    else {
        if (nil != audioPlayer) {
            [audioPlayer play];
            audioPlayer.volume = 0.0;
            [self performSelector:@selector(doBgMusicFadeIn)];
            [self performSelector:@selector(doBgMusicFadeDown) withObject:nil afterDelay:3];
            [self performSelector:@selector(startVoiceBroadcast) withObject:nil afterDelay:4];

        }
    }
}

-(void)dealloc
{
    //position
    [NSObject cancelPreviousPerformRequestsWithTarget:self];

    [super dealloc];

}

cancelPreviousPerformRequestsWithTarget:self in dealloc вызывается, но не работает, селекторы по-прежнему вызываться.Но cancelPreviousPerformRequestsWithTarget:self в voiceBroadcast не имеют проблем.Разве cancelPreviousPerformRequestsWithTarget метод не может быть использован в dealloc?

Ответы [ 3 ]

5 голосов
/ 25 октября 2011

Если вы используете UIViewController ...

Я не знаю, почему он не выполняется, но вы можете попробовать поставить

[NSObject cancelPreviousPerformRequestsWithTarget:self];

в -viewDidUnload метод, который вызывается перед dealloc.

Подробнее в Справка UIViewController

1 голос
/ 21 мая 2012

У меня никогда не было успеха с

[NSObject cancelPreviousPerformRequestsWithTarget:(id)]

Так что вместо этого я использую

[NSObject cancelPreviousPerformRequestsWithTarget:(id) selector:(selector) object:(id)]

Единственным недостатком является то, что вы должны делать один вызов последнему для каждого отложенного исполнения, которое вы настроили ранее.

Надеюсь, это кому-нибудь поможет. Понятия не имею, почему первый, кажется, не работает для меня.

0 голосов
/ 01 октября 2013

Вы передали nil в качестве аргумента в методе executeSelector и использовали метод cancelPrevious с self в качестве аргумента. Использование различных объектов в параметре вызывает проблему.

используйте это,

[self performSelector:@selector(SampleMethod) withObject:self afterDelay:delayTime];
[NSObject cancelPreviousPerformRequestsWithTarget:self];
...