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

首先,感谢这个网站上的每个人……这对于深入了解iOS编程非常有帮助。

我目前的问题:

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

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

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

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

任何建议都将非常感谢!

谢谢!

ARC在这样的背景下没有任何区别。

这只是意味着你不必自己打电话。

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

 - ( void )didReceiveMemoryWarning: { [ _myProperty release ]; _myProperty = nil; [ super didReceiveMemoryWarning ]; } 

在ARC下,它完全相同,除了你不必调用release

 - ( void )didReceiveMemoryWarning: { _myProperty = nil; [ super didReceiveMemoryWarning ]; } 

将您的属性设置为nil将在ARC下自动释放它。
所以它确实做了些什么。

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

最后一个肯定是问题……

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

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

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

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

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

 [myContext drawImage:myImage atPoint:P fromRect:tileBounds]; 

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