MASSIVE AVAudioPlayer Утечки памяти - PullRequest
0 голосов
/ 09 мая 2011

Я использую AVAudioPLayer для воспроизведения звука в моей игре. У меня есть следующий код в методе в отдельном классе, который вызывается каждый раз, когда я хочу, чтобы воспроизводился звук «boing». Проблема в том, что он теряет огромное количество памяти до такой степени, что игра становится недоступной для игры. Теперь я не освобождаю ни один из указателей в методе, потому что в то время у меня был только один. Но теперь у меня есть 10 из этих методов.

Какой лучший способ освободить указатели в этом случае? (Да, я попытался выпустить сразу после [boing play]; это устраняет утечку (очевидно), но звук не воспроизводится, поэтому нет никакого смысла.

    -(void)playBoing {
        int x = (arc4random()%3)+1;
        NSString *path = [NSString stringWithFormat:@"/boing_0%i.aif", x];

        NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
        resourcePath = [resourcePath stringByAppendingString:path];

        AVAudioPlayer *boing = [[AVAudioPlayer alloc] initWithContentsOfURL:
                                [NSURL fileURLWithPath:resourcePath] error:nil];

        boing.delegate = self;
        boing.volume = 1;

        [boing play];
}

1 Ответ

2 голосов
/ 09 мая 2011

Возможно, есть лучшее решение, но у меня были похожие проблемы, когда немедленное освобождение убило мой процесс. Это решение, которое я принял. Опять же, там может быть лучше, но для быстрого исправления это должно сработать.

В вашем заголовочном файле создайте следующее:

AVAudioPlayer *boing;

Затем в -(void)playBoing сделайте, как вы, но измените

AVAudioPlayer *boing = [[AVAudioPlayer alloc] initWithContentsOfURL:
                        [NSURL fileURLWithPath:resourcePath] error:nil];

до

if (boing != nil) {
    boing = nil;
    [boing release];
}
boing = [[AVAudioPlayer alloc] initWithContentsOfURL:
         [NSURL fileURLWithPath:resourcePath] error:nil];

Это должно гарантировать, что за один раз выделяется только один экземпляр boing

...