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

У меня есть этот метод во внешнем классе, который вызывается всякий раз, когда персонаж в моей игре попадает в стену (в среднем, примерно раз в 5 секунд). Я не понимаю этого. Я думал, что был на вершине управления памятью. Каждый раз, когда вызывается метод, происходит утечка небольшого объема памяти (Malloc 38 или 42 байта). Это происходит, и игра зависает. Вот мой код:

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

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

    boing.delegate = self;
    boing.volume = 1;
    [boing play];
}

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Конечно, это приводит к утечке памяти

Сначала вы сказали, что boing равен нулю (но память не освобождена, утечка), а затем пытаетесь отправить сообщение об освобождении на ноль.Вы должны сделать это так:

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

Нет необходимости проверять boing на nil перед выпуском, потому что отправка сообщения на nil ничего не делает

1 голос
/ 11 мая 2011

Я думаю, что следующее утверждение является источником утечки памяти,

player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err];

Вот SO сообщения, которые обсуждали ту же проблему.

Утечка памяти в AVAudioPlayer

Утечка памяти в AVAudioPlayer

Утечка памяти в AVAudioPlayer - Media Player Framework

Вот пост в блоге

Утечка памяти в AVAudioPlayer

Согласно руководству по блогу ваш код должен выглядеть следующим образом.

-(void)setPlayer
{

    NSURL *file = [[NSURL alloc] initFileURLWithPath:
                   [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"shut up.mp3"]];
    NSError *err = nil;

    NSData *data = [NSData dataWithContentsOfFile:file];
    AVAudioPlayer *player = [AVAudioPlayer alloc];    
    if([player initWithData:audioData error:NULL])
     {

        player.numberOfLoops = -1;
        [player prepareToPlay];
        player.volume=1.0;
        [player autorelease];
    } 
    else 
    {
        [player release];
        player = nil;
    }
    [file release];
}

Версия без утечек хранит указатель, возвращаемый alloc, а не указатель, возвращаемый initWithData: error :. Таким образом, что бы ни случилось, игрок все еще может быть освобожден.

...