Ios 如何在ARC中释放内存以实现高内存使用率图形渲染?

Ios 如何在ARC中释放内存以实现高内存使用率图形渲染?,ios,memory,core-graphics,automatic-ref-counting,core-image,Ios,Memory,Core Graphics,Automatic Ref Counting,Core Image,首先,感谢你在这个网站上的每一个人……这对于深入了解iOS编程的精髓非常有帮助 我的最新一期: 我有一个应用程序,可以呈现一张非常风格化的照片。它使用了一些CoreImage过滤器,但需要一堆CoreGraphics来完成繁重的图像处理 代理大小渲染效果很好,但是当我渲染图像的全分辨率版本时,它有时会因为高内存使用率而崩溃。问题是在渲染时,我需要能够在内存中有几个全分辨率(3264x2448)缓冲区。我不知道如何释放更多的内存。我一直非常小心地匹配CGImageRelease,无论我在哪里都可以

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

我的最新一期:

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

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

有了ARC,我怎么知道什么东西真的被释放了?将对象设置为nil实际上没有任何作用

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

任何建议都将不胜感激


谢谢

在这种情况下,ARC没有什么区别

这只是意味着你不必自己调用
release

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

在ARC下,它完全相同,只是您不必调用
release

- ( void )didReceiveMemoryWarning:
{
    _myProperty = nil;

    [ super didReceiveMemoryWarning ];
}
将属性设置为
nil
将在ARC下自动释放该属性。
所以它确实起了作用

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


最后一个肯定是问题所在。

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

[myContext drawImage:myImage atPoint:P fromRect:tileBounds];
在循环中,更改
p
tileBounds
,以便最终覆盖整个输出图像区域。

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

您需要30 MB的内存才能在该分辨率的内存中保存单个图像(3264x2448,假设每个像素32位)。虽然你没有说你需要多少这样大小的内存缓冲区,但听起来至少有三个——对于许多iOS设备来说,你的内存基本上是有限的(最初的iPad和iPhone 3GS总共只有256MB。其中,你可能只能访问三分之一。你的应用程序可用的内存是高度可变的)

ARC不像垃圾收集,它只是在编译时添加
release
retain
语句。如果代码结构正确,图像将在不再需要时释放。我强烈怀疑,如果关闭ARC(可以使用编译器标志逐个文件执行),您将看到相同的结果


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

谢谢,但是在CoreGraphics模糊类型函数中平铺效果不好。如果设置正确,平铺效果会很好。在这种情况下,它可以正确地铺瓷砖。看见虽然表明它已经在内部平铺。无论如何,我会尝试一下,因为它可能允许你以比CoreImage内部更智能的方式控制内存。CoreImage blur在iPhone上不可用(如果可以的话),所以我制作了自己的模糊过滤器,使用CoreGraphics上下文,我怀疑它会因为边缘等原因而平铺…但我可能会尝试一下。Thx。我已经用泄漏和分配工具查找了很多泄漏,但没有任何泄漏。至于设置为零,我已经读了很多关于这两种方法的书。我来试试看。Thx.我发现CoreImage实际上是内存猪。哇!对于一些被认为是有效的东西来说,它显然不是。我在管道中设置了5或6个简单的CoreImage过滤器,用于对同一图像进行一行正常的亮度/对比度/饱和度/色调操作。CoreImage应该将所有开销保持在较低的水平,并且在您要求时只渲染一次图像,但是,伙计,这看起来很麻烦!对于那些简单的操作,它使用了135mb的内存!我把CoreImage的东西装进了罐头,自己写了,现在连30mb都没有。吸取的教训。。。
[myContext drawImage:myImage atPoint:P fromRect:tileBounds];