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