我即将结束一个大型的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;
}
我不确定如何解决这个问题,我们将非常感谢您对此事的任何帮助。
感谢。
答案 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
的额外分配时,您将创建您正在寻找的泄漏。