MASSIVE AVAudioPlayer Memory Leaks

夙愿已清 提交于 2019-12-20 07:21:44

问题


I am using AVAudioPLayer to do the audio for my game. I have the following code in a method in a seperate class, which is called every time I want the 'boing' sound to play. Problem is, it leaks huge amounts of memory, to the point where the game becomes unplayable. Now i'm not releasing any of the pointers in the method, because at the time I only had one. But now I have 10 of these methods.

What is the best way to release the pointers in tis case? (Yes, I have tried releasing straight after [boing play];, this solves the leak (obviously) but the sound dosen't play so theres no point.

    -(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:


It's possible there's a better solution, but I've had similar problems where releasing right away killed my process. This is the solution I took. Again, there may be better out there, but for a quick fix, it should do the trick.

In your header file, create the following:

AVAudioPlayer *boing;

Then in -(void)playBoing, do as you did, but change

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

to

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

This should ensure that there's only one instance of boing allocated at a time



来源:https://stackoverflow.com/questions/5932913/massive-avaudioplayer-memory-leaks

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!