记忆问题 - 生活与整体 - > app被杀了

时间:2012-09-01 08:18:41

标签: ios memory-management didreceivememorywarning xcode-instruments memory-warning

我正在尝试检查仪器中的应用程序内存问题。当我加载应用程序时,我播放一些声音并在UIImageViews中显示一些动画。 为了节省一些内存,我只在需要时加载声音,当我停止播放时,我将其从内存中释放出来。

问题1:

我的应用程序使用大约5.5MB的生存。但是整体部分在开始后增长到20MB,然后慢慢增长(大约100kB /秒)。但是,负责图书馆的OpenAL(OAL ::缓冲区),使dyld(_dyld_start)-I我不知道这真的是,和一些其他的东西像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]];

AND IMAGE ANIMATIONS: 我从大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

2 个答案:

答案 0 :(得分:1)

删除内存泄漏的建议:

1)使用ARC的iOS5功能。

2)使用this

进一步检查项目中的内存泄漏

希望这有帮助

答案 1 :(得分:0)

  

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

你永远不会发布这个。您在分配时保留了一个。

在数组上调用replace或者将数组索引设置为NSNull, 不释放对象。

您必须在您存储的每个声音实例上调用release。