【问题标题】:Memory issues - Living vs. overall -> app is killed内存问题 - 生活与整体 -> 应用程序被杀死
【发布时间】:2012-08-26 21:48:01
【问题描述】:

我正在尝试在 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

【问题讨论】:

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


    【解决方案1】:

    消除内存泄漏的建议:

    1) 使用 ARC 的 iOS5 功能。

    2) 使用this进一步检查项目中的内存泄漏

    希望对你有帮助

    【讨论】:

    • 1,是的。这个项目已经在使用 ARC。 2,谢谢。它帮助我找到了 CGImageRef 及其 CGImageRelease 的一些问题。但它并没有帮助我发现不断增长的整体内存,或者问题出在整体或其他任何地方...... :(
    • Xcode 中的 Analyze 帮助你指出所有与代码相关的内存泄漏,而不仅仅是 CGImageRelease 和 CGI​​mageRef
    • 是的。我知道。好吧,实际上它只向我展示了 CGImageRef 问题,很少有从未使用过的变量等等。我的代码没有大问题。有什么我应该启用的选项吗?我刚刚进入 Product->Analyze 并查看了左侧面板中的蓝色问题(或我的代码中的蓝色突出显示行)。并把它们都修好了。但我的“整体记忆”仍在增加。我认为这是由于我的 UIImageView 动画 - 我正在切换 UIImageView 动画数组。是否有任何“保存”图像动画帧数(或内存大小)的 +- 数?
    【解决方案2】:

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

    你永远不会发布这个。您在分配时的保留计数为 1。

    在其所在的数组上调用替换或将数组索引设置为 NSNull, 不释放对象。

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

    【讨论】:

    • 但是我在这个项目上使用了 ARC -> 所以如果你的意思是使用 [声音发布],我认为它在 ARC 下是不允许的。这是正确的还是您在谈论其他任何事情?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多