Не удается устранить серьезную утечку памяти из Open AL - PullRequest
2 голосов
/ 13 октября 2009

Я близок к завершению большого проекта 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 Ответ

2 голосов
/ 13 октября 2009

Разве «утечка» - это не просто «1001» синглтон? Я не уверен, как работает обнаружение утечек, но с определенной точки зрения большинство синглетонов имеют утечки , поскольку они освобождают память только после выхода из приложения.

Если это действительно так, то это зависит от того, нужно ли вам освободить память, используемую звуками. Использование памяти не должно увеличиваться, поэтому вам не нужно беспокоиться о сценарии «традиционной утечки», когда ваше приложение занимает все больше и больше памяти, пока оно не будет уничтожено. Код, который вы используете, похоже, не поддерживает выгрузку звука, поэтому, если вы хотите освободить память, вам придется добавить этот код самостоятельно.

И личная точка зрения: написание движка со звуковыми эффектами с использованием синглтона не является хорошим дизайном. Управление звуками становится болью (это именно та проблема, с которой вы сталкиваетесь), синглтон добавляет много ненужного стандартного кода и т. Д. Я не вижу причин, по которым звуки не должны быть простыми отдельными объектами со своим собственным жизненным циклом - это способ Я сделал это в моей попытке использовать движок OpenAL SFX . Конечно, я могу ошибаться.


Обновление: Я полагаю, что магическое «назначение здесь не сделано» является ключом. Единый код взят из документации Apple , но кто-то вставил дополнительное назначение. Метод sharedFoo должен выглядеть следующим образом:

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

Когда вы выполняете дополнительное присвоение self, вы создаете искомую утечку.

...