Утечки AVAudioPlayer?

У меня проблема, и я не знаю, как с ней справиться. Тайринг для создания приложения со звуком и анимацией. Это дает мне предупреждение уровня 1, а затем уровня 2. Я пробовал строить и анализировать, и у меня есть все эти потенциальные утечки. Если я отпущу звук, звук не будет воспроизводиться. Какие-нибудь намеки?

Вот часть кода и утечки, которые у меня есть

    - (IBAction)playsound2
    {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"cat" ofType:@"mp3"];
        AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
        *- **Method returns an Objective-C object with a +1 retain count (owning reference)***
        theAudio.delegate = self;
        [theAudio play];

        ***-  Object allocated on line 302 and stored into 'theAudio' is no longer referenced after this point and has a retain count of +1 (object leaked)***


        cat1.hidden = 0;
        cat.hidden = 1;
        [cat1 startAnimating];
        cat.center = cat1.center;
        [self performSelector:@selector(loadAnimations) withObject:nil afterDelay:1.0];
        catLabel.hidden = 0;
    }

person ftwhere    schedule 28.08.2011    source источник


Ответы (2)


Вот решение той же проблемы. спросил пока.

    - (AVAudioPlayer *)audioPlayerWithContentsOfFile:(NSString *)path {
        NSData *audioData = [NSData dataWithContentsOfFile:path];
        AVAudioPlayer *player = [AVAudioPlayer alloc];
        if([player initWithData:audioData error:NULL]) {
            [player autorelease];
        } else {
            [player release];
            player = nil;
        }
        return player;
    }

А для лучшего понимания вы также можете следить за это

person alloc_iNit    schedule 28.08.2011

Вы должны указать переменную экземпляра для экземпляра класса AVAudioPlayer.

//Instance variable:
{
    AVAudioPlayer* theAudio;
}

- (IBAction)playsound2
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"cat" ofType:@"mp3"];
    if (!theAudio ) {
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
        if (theAudio ) {
            theAudio.delegate = self;
            [theAudio play];
        }
    }

    cat1.hidden = 0;
    cat.hidden = 1;
    [cat1 startAnimating];
    cat.center = cat1.center;
    [self performSelector:@selector(loadAnimations) withObject:nil afterDelay:1.0];
    catLabel.hidden = 0;
}
person waterforest    schedule 10.05.2012