引用CGLayer doc:

  

Quartz缓存任何重用的对象,包括CGLayer对象。

我在大页面上遇到内存问题,并且我正在尝试实现一个简单的机制,根据它们是否处于开/关屏幕来释放和重新创建视图。

为了简单起见,我说有一堆UIImages,是作为网络请求的结果创建的,保存在某个地方的数组中。我像这样创建一个UIImageView:

anImage = [anArray objectAtIndex:0];
UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];
[mainView addSubview:imgView]; // Quartz eats memory for view after first draw
[imgView release];             // owned by mainView now
[...]                          // wait a bit for draw cycle
[imgView removeFromSuperview]; // memory doesn't go down

imgView 离开屏幕时,它是 removedFromSuperview 并被释放。好吧?不存在 - Quartz中存在的CGLayer不会被删除,因为 anImage 仍然存在。

我该如何解决这个问题?在这种情况下,唯一的方法是使用不同的指针地址在Quartz的背后创建一个完全相同的图像并删除旧图像。而这样做的唯一方法是“深度复制”图像(UIImage不实现NSCoding)或通过网络再次请求(慢速)。

我的想法是,我需要将我的图像设置为数据库并在每次屏幕上显示时重新获取它们 - 但我很想听到人们对此的看法。

有帮助吗?

解决方案

这里你将imgView从0增加到1。

UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];

在下一行中,mainView会增加引用计数。 (现在是2)

[mainView addSubview:imgView]; // Quartz eats memory for view after first draw

在这里,你发布了imgView,引用计数又回到了一个。

[imgView release]; // owned by mainView now

我不认为你的记忆问题与anImage有关。只要imgView是子视图,它就不会释放该对象,因为它需要该对象绘制到屏幕上。

以下行的含义是,如果您以编程方式绘制到CGLayer,Quartz并使用缓存绘制您所绘制的内容,这样您就不会不断重绘同样的内容。它与添加子视图无关。

  

Quartz缓存任何重用的对象,包括CGLayer对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top