如何在ARC中释放内存以获得高内存使用率的图形渲染?

时间:2012-01-30 17:47:13

标签: ios memory core-graphics automatic-ref-counting core-image

首先,感谢本网站上的所有人......对于深入了解iOS编程,这一点非常有帮助。

我目前的问题:

我有一个应用程序,可以呈现一个非常风格化的照片版本。它为其中一些使用了一些CoreImage过滤器,但需要一堆CoreGraphics来完成繁重的图像处理。

代理大小渲染效果很好,但是当我渲染我的图像的完整分辨率版本时,由于内存使用率很高,它有时会崩溃。问题是我需要能够在渲染时在内存中有几个全分辨率(3264x2448)缓冲区。我不知道什么或如何释放更多的记忆。我一直非常小心地匹配CGImageRelease到处都可以。

使用ARC,我如何知道某些内容是否真正被释放并释放?将对象设置为nil并没有真正做任何事情。

我怀疑我能以任何方式将其传输到磁盘。

非常感谢任何建议!

谢谢!

3 个答案:

答案 0 :(得分:8)

ARC在这样的环境中没有任何区别。

这只是意味着您不必亲自致电release

对于非ARC,在内存不足的情况下,您可能希望发布一些您并不真正需要的属性(这意味着可以根据需要重新创建它们)。

- ( void )didReceiveMemoryWarning:
{
    [ _myProperty release ];

    _myProperty = nil;

    [ super didReceiveMemoryWarning ];
}

在ARC下,它完全相同,除非您不必致电release

- ( void )didReceiveMemoryWarning:
{
    _myProperty = nil;

    [ super didReceiveMemoryWarning ];
}

将您的财产设置为nil将在ARC下自动释放 所以它真的有所作为。

如果它对您不起作用,那么您肯定会遇到另一个问题 确保没有内存泄漏,也没有retain cycles

最后一个肯定是问题......

答案 1 :(得分:2)

正如所建议的那样(但未明确说明) - 这不是ARC问题。

您将需要 30 MB 的内存来保存该分辨率的内存中的单个图像(3264x2448,假设每像素32位)。虽然你没有说你在内存中需要多少那么大的缓冲区,但听起来至少有三个 - 你的内存限制基本上是你的内存限制(原版iPad和iPhone 3GS只有256MB < em> total 。其中,您可能只能访问第三个。您的应用程序可用的内存变化很大。)

ARC不像垃圾收集 - 它只是在编译时添加releaseretain语句。如果您正确构建了代码,那么您的图片将在不再需要时发布。我强烈怀疑如果你关掉ARC(你可以逐个文件地使用编译器标志),你会看到相同的结果。

正如某人已经发布的那样,解决这个问题的方法是平铺图像,并一次处理一小部分样本。如果你的模糊算法无法应对,那么硬道理就是你可能不得不写一个做的!

答案 2 :(得分:0)

您应该平铺图像,并且一次只能处理部分图像。您可以通过创建CIImage然后调用:

来执行此操作
[myContext drawImage:myImage atPoint:P fromRect:tileBounds];

循环并更改PtileBounds,以便最终覆盖整个输出图像区域。