无法修复Open AL的严重内存泄漏

时间:2009-10-13 08:19:51

标签: iphone objective-c audio memory-leaks openal

我即将结束一个大型的iPhone项目,同时检查内存泄漏时,偶然发现了这个巨大的问题。我按照本教程实现了声音:

http://www.gehacktes.net/2009/03/iphone-programming-part-6-multiple-sounds-with-openal/

运行一个魅力,很多人都使用它,但是当声音最初被加载时,我得到一个巨大的泄漏项目的开始。下面是泄漏开始的代码行:

[[Audio sharedMyOpenAL] loadSoundWithKey:@"music" File:@"Music" Ext:@"wav" Loop:true];
[[Audio sharedMyOpenAL] loadSoundWithKey:@"btnPress" File:@"BtnPress" Ext:@"wav" Loop:false];
[[Audio sharedMyOpenAL] loadSoundWithKey:@"ting1" File:@"GlassTing1" Ext:@"wav" Loop:false];

等。它总共加载了20个声音。更具体地说,在Audio.m文件中这段代码:

+ (Audio*)sharedMyOpenAL {

@synchronized(self) {
    if (sharedMyOpenAL == nil) {
        sharedMyOpenAL = [[self alloc] init]; // assignment not done here

    }
}
return sharedMyOpenAL;
}

我不确定如何解决这个问题,我们将非常感谢您对此事的任何帮助。

感谢。

1 个答案:

答案 0 :(得分:2)

“泄漏”不仅仅是Audio单身人士吗?我不确定泄漏检测是如何工作的,但从某个角度来看,大多数单例泄漏,因为它们只会在应用程序退出后释放内存。

如果确实如此,则取决于您是否需要释放声音使用的内存。内存使用量不应该增加,因此您不必担心“传统泄漏”情况,即应用程序在被杀死之前会占用越来越多的内存。您使用的代码似乎不支持声音卸载,因此如果您想释放内存,则必须自己添加该代码。

个人观点:使用单身人物编写音效引擎并不是一个好的设计。管理声音变得很痛苦(这正是你所面临的问题),单例添加了许多不必要的样板代码等等。我认为声音不应该是简单的单独对象与自己的生命周期 - 这就是方式我已经在my attempt at an OpenAL SFX engine完成了。当然,我可能是错的。


更新:我认为魔术'未在这里完成的任务'是关键。单例代码取自Apple documentation,但有人插入了额外的赋值。 sharedFoo方法应如下所示:

+ (MyGizmoClass*)sharedManager
{
    @synchronized(self) {
        if (sharedGizmoManager == nil) {
            [[self alloc] init]; // assignment not done here
        }
    }
    return sharedGizmoManager;
}

当您执行self的额外分配时,您将创建您正在寻找的泄漏。