MASSIVE AVAudioPlayer内存泄漏

时间:2011-05-09 05:32:52

标签: iphone objective-c cocoa-touch memory-management avaudioplayer

我正在使用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 个答案:

答案 0 :(得分:2)

有可能有一个更好的解决方案,但我遇到了类似的问题,立即发布会杀死我的进程。这是我采取的解决方案。再一次,可能会有更好的,但为了快速解决,它应该做的伎俩。

在头文件中,创建以下内容:

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个实例

相关问题