Проблемы с памятью - жизнь против всего -> приложение убито

Я пытаюсь проверить проблемы с памятью приложений в инструментах. Когда я загружаю приложение, я воспроизвожу некоторые звуки и показываю некоторые анимации в UIImageViews. Чтобы сэкономить немного памяти, я загружаю звуки только тогда, когда они мне нужны, и когда я перестаю играть, я освобождаю их из памяти.

проблема 1:

Мое приложение использует около 5,5 МБ оперативной памяти. НО Общий раздел растет после запуска до 20 МБ, а затем медленно растет (около 100 КБ / сек). Но ответственная библиотека — это OpenAL (OAL::Buffer), dyld (_dyld_start) — я не уверен, что это такое на самом деле, и некоторые другие вещи, такие как ft_mem_qrealloc, CGFontStrikeSetValue, …

проблема 2:

Когда общий раздел разрывается примерно на 30мб, приложение вылетает (убивается). Согласно фактам, которые я уже читал об общей памяти, это означает, что все мои выделения и освобождения составляют около 30 МБ. Но я не вижу проблемы. Например, когда мне нужен какой-то звук, я загружаю его в память, а когда он мне больше не нужен, я его отпускаю. Но это означает, что когда я загружаю 1 МБ звука, эта операция увеличивает общее использование памяти на 2 МБ. Я прав? И когда я загружаю 10 звуков, мое приложение падает только потому, что мой общий уровень слишком высок, даже жизнь все еще низка??? Я очень смущен этим.

Может ли кто-нибудь помочь мне прояснить это?

(Я на iOS 5 и использую ARC)

НЕКОТОРЫЙ КОД:

создание звука OpenAL:

MYOpenALSound *sound = [[MyOpenALSound alloc] initWithSoundFile:filename willRepeat:NO];

if(!sound)
    return;

[soundDictionary addObject:sound];

играет:

[sound play];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, ((sound.duration * sound.pitch) + 0.1) * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
[soundDictionary removeObjectForKey:[NSNumber numberWithInt:soundID]];
    });
}

создание звука с помощью AVAudioPlayer:

[musics replaceObjectAtIndex:ID_MUSIC_MAP withObject:[[Music alloc] initWithFilename:@"mapMusic.mp3" andWillRepeat:YES]];

pom = [musics objectAtIndex:musicID];
[pom playMusic];

и остановить и освободить его:

[musics replaceObjectAtIndex:ID_MUSIC_MAP withObject:[NSNull null]];

И АНИМАЦИЯ ИЗОБРАЖЕНИЙ: я загружаю изображения из большого файла PNG (это относится и к моей другой теме: https://stackoverflow.com/questions/12223714/memory-warning-uiimageview-and-its-animations) У меня есть несколько UIImageView, и со временем я устанавливаю массивы анимации для воспроизведения анимации...

UIImage *source = [[UIImage alloc] initWithCGImage:[[UIImage imageNamed:@"imageSource.png"] CGImage]];

cutRect = CGRectMake(0*dimForImg.width,1*dimForImg.height,dimForImg.width,dimForImg.height);
image1 = [[UIImage alloc] initWithCGImage:CGImageCreateWithImageInRect([source CGImage], cutRect)];
cutRect = CGRectMake(1*dimForImg.width,1*dimForImg.height,dimForImg.width,dimForImg.height);
...
image12 = [[UIImage alloc] initWithCGImage:CGImageCreateWithImageInRect([source CGImage], cutRect)];

NSArray *images = [[NSArray alloc] initWithObjects:image1, image2, image3, image4, image5, image6, image7, image8, image9, image10, image11, image12, image12, image12, nil];

и этот массив я просто использую просто так:

myUIImageView.animationImages = images, ... duration -> startAnimating



Ответы (2)


Предложения по устранению утечек памяти:

1) Используйте функцию ARC для iOS5.

2) Далее проверьте утечки памяти в вашем проекте, используя это

Надеюсь это поможет

person Vimal Venugopalan    schedule 01.09.2012
comment
1, да. этот проект уже использует ARC. 2, спасибо. Это помогло мне найти некоторые проблемы с CGImageRef и его CGImageRelease. Но это не помогло мне обнаружить растущую общую память или проблему с общей или где-то еще... :( - person D33; 01.09.2012
comment
Analyze в Xcode помогает выявить все утечки памяти, связанные с кодом, а не только CGImageRelease и CGImageRef. - person Vimal Venugopalan; 01.09.2012
comment
да. Я знаю. Ну, на самом деле он показал мне только проблемы с CGImageRef и несколько никогда не используемых переменных и так далее. Не большие проблемы с моим кодом. Есть ли какая-то опция, которую я должен включить или что-то в этом роде? Я просто зашел в Product-›Analyze и посмотрел на синие проблемы на левой панели (или синие выделенные строки в моем коде). И все исправил. Но все же моя общая память все еще увеличивается. Я думаю, это связано с моей анимацией UIImageView - я переключаю массивы анимации UIImageView. Есть ли +- количество кадров анимации сохранения изображения (или размер в памяти)? - person D33; 01.09.2012

MYOpenALSound *sound = [[MyOpenALSound alloc] initWithSoundFile:filename willRepeat:NO];

Ты никогда не выпускаешь это. У вас есть счетчик сохранения, равный единице при распределении.

Вызов замены массива, в котором он находится, или установка индекса массива в NSNull не освобождает объект.

Вы должны вызывать релиз для каждого экземпляра звуков, которые вы сохраняете.

person deleted_user    schedule 01.09.2012
comment
но я использую ARC в этом проекте -> поэтому, если вы имеете в виду использование [выпуска звука], я думаю, что это не разрешено ARC. Это правильно или вы о чем-то другом? - person D33; 01.09.2012