我正在尝试在 Instruments 中检查我的应用程序内存问题。当我加载应用程序时,我会播放一些声音并在 UIImageViews 中显示一些动画。为了节省一些内存,我只在需要时加载声音,当我停止播放时,我将它从内存中释放出来。
问题1:
我的应用程序使用了大约 5.5MB 的 Living 内存。但是整体部分在开始到 20MB 后开始增长,然后缓慢增长(大约 100kB/秒)。但是负责的库是 OpenAL (OAL::Buffer)、dyld (_dyld_start)——我不确定这到底是什么,还有一些其他的东西,比如 ft_mem_qrealloc、CGFontStrikeSetValue,……
问题2:
当整个部分超过 30MB 时,应用程序崩溃(被杀死)。根据我已经阅读的有关整体内存的事实,这意味着我的所有分配和释放大约是 30MB。但我真的看不出问题所在。例如,当我需要一些声音时,我将它加载到内存中,当我不再需要它时,我释放它。但这意味着当我加载 1MB 声音时,此操作会增加 2MB 的整体内存使用量。我对吗?当我加载 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 )我有几个 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