CALayer似乎保留了它的内容——如何释放资源? [复制]

Posted

技术标签:

【中文标题】CALayer似乎保留了它的内容——如何释放资源? [复制]【英文标题】:CALayer seems to retain its contents - how to release resources? [duplicate] 【发布时间】:2013-01-08 17:53:43 【问题描述】:

可能重复:Can’t release unused CALayer memory when using multiple layers

我有一个应用程序,它允许用户浏览一系列 CALayers 图像。我发现在屏幕上添加超过 20 个后,iPad 2 会崩溃 - 显然我需要在屏幕上可见时动态加载它们。

所以我实现了这一点,当不再需要时,将 CALayer 从其 SuperLayer 中移除。然而,我发现在“活动监视器”中查看时内存并没有消失。但是,当我在模拟器中“模拟内存警告”时,它确实会被释放。你可能会想 - 这就是内存警告的用途。然而 - 当我浏览图像时,我仍然发现 iPad 内存不足,内存使用量不断上升,直到崩溃。有谁知道强制 CALayer 释放其资源的方法?

这是我的代码,请注意,如果我省略了分配图层内容,那么内存使用率仍然很低(当然你看不到图像)

    UIImage* image = [UIImage imageNamed:@"imageName"];

    frontLayer = [CALayer layer];
    frontLayer.bounds = CGRectMake(0, 0, 952, 650);
    frontLayer.contents = (id) image.CGImage;

注意我不使用 ARC,在我从其超层中删除该层后,我将其释放(它由属性保留)。内存似乎被低内存警告回收的事实让我认为这不是我保留/释放方式的问题,但我对想法持开放态度。

【问题讨论】:

在从超级层中移除层之前,您不能只将层的内容设置为 nil 吗? @zneak - 不,不使用 ARC,抱歉应该说清楚。我已经更新了问题。 @jmstone 这没有任何作用。我也尝试过在内容上使用 CFRelase(),但这本身会导致崩溃(我猜是过度释放) 大家好,让我感到震惊的是,你们对 CALayer 的了解比我更好。我发布了一个 CALayer malloc 问题,如果你们中的任何一个可以看一下,我将非常感激...***.com/questions/26715727/… 【参考方案1】:

我发现这实际上是这篇文章的副本

[UIImage imageNamed:@""];使用缓存,当我使用 [UIImage imageWithContentsOfFile:@""] 时,问题就消失了。

Can't release unused CALayer memory when using multiple layers

【讨论】:

以上是关于CALayer似乎保留了它的内容——如何释放资源? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Nib 创建的视图保留文件的所有者防止 UIViewController 的释放

为啥自我实现的 getter 应该保留并自动释放返回的对象?

CALayer:在图层内容上维护cornerRadius

CALayer subLayer 边界舍入错误?

iOS6 CALayer释放/卸载滚动视图中滚动不可见的视图

-[CALayer release]:消息发送到释放的实例