AVAudioPlayer подтекает? - PullRequest
       1

AVAudioPlayer подтекает?

0 голосов
/ 28 августа 2011

У меня проблема, и я не знаю, как ее решить. Tyring для создания приложения со звуком и анимацией. Это дает мне предупреждение уровня 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;
    }

Ответы [ 2 ]

6 голосов
/ 28 августа 2011

Здесь - это решение той же проблемы, о которой мы уже говорили.

    - (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;
    }

И для лучшей идеи вы можете следовать этому.

0 голосов
/ 10 мая 2012

Вы должны указать переменную экземпляра для экземпляра класса 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;
}
...