首先,感谢本网站上的所有人......对于深入了解iOS编程,这一点非常有帮助。
我目前的问题:
我有一个应用程序,可以呈现一个非常风格化的照片版本。它为其中一些使用了一些CoreImage过滤器,但需要一堆CoreGraphics来完成繁重的图像处理。
代理大小渲染效果很好,但是当我渲染我的图像的完整分辨率版本时,由于内存使用率很高,它有时会崩溃。问题是我需要能够在渲染时在内存中有几个全分辨率(3264x2448)缓冲区。我不知道什么或如何释放更多的记忆。我一直非常小心地匹配CGImageRelease到处都可以。
使用ARC,我如何知道某些内容是否真正被释放并释放?将对象设置为nil并没有真正做任何事情。
我怀疑我能以任何方式将其传输到磁盘。
非常感谢任何建议!
谢谢!
答案 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不像垃圾收集 - 它只是在编译时添加release
和retain
语句。如果您正确构建了代码,那么您的图片将在不再需要时发布。我强烈怀疑如果你关掉ARC(你可以逐个文件地使用编译器标志),你会看到相同的结果。
正如某人已经发布的那样,解决这个问题的方法是平铺图像,并一次处理一小部分样本。如果你的模糊算法无法应对,那么硬道理就是你可能不得不写一个做的!
答案 2 :(得分:0)
您应该平铺图像,并且一次只能处理部分图像。您可以通过创建CIImage
然后调用:
[myContext drawImage:myImage atPoint:P fromRect:tileBounds];
循环并更改P
和tileBounds
,以便最终覆盖整个输出图像区域。