Проблемы с памятью - Жизнь против всего -> приложение убито
Я пытаюсь проверить проблемы памяти моих приложений в Инструментах. Когда я загружаю приложение, я играю некоторые звуки и показываю некоторые анимации в 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 для каждого экземпляра звуков, которые вы храните.