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

Я пытаюсь проверить проблемы памяти моих приложений в Инструментах. Когда я загружаю приложение, я играю некоторые звуки и показываю некоторые анимации в 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://stackru.com/questions/12223714/memory-warning-uiimageview-and-its-animations) У меня есть несколько UIImageViews и по времени я устанавливаю массивы анимации для воспроизведения анимации...

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) Используйте функцию iOS5 в ARC.

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

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

MYOpenALSound *sound = [[MyOpenALSound alloc] initWithSoundFile: имя файла будет повторяться: НЕТ];

Вы никогда не выпускаете это. У вас есть один счет на распределение.

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

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

Другие вопросы по тегам