1

引用 CGLayer 文档:

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)或通过网络再次请求它(慢)。

我在想的是,我需要将我的图像 sqllite 到数据库中,并在每次屏幕出现视图时重新获取它们——但我很想听听人们对此的想法。

4

1 回答 1

1

在这里,您将 imgView 从 0 增加到 1。

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

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

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

在这里,您释放 imgView 并且引用计数回落到 1。

[imgView release]; // owned by mainView now

我认为您的记忆问题与 anImage 没有任何关系。只要 imgView 是一个子视图,它就不会释放该对象,因为它需要该对象才能绘制到屏幕上。

下面这行的意思是,如果您以编程方式绘制到 CGLayer,Quartz 会缓存您绘制的内容,这样您就不会不断地重绘相同的东西。它与添加子视图并没有真正的关系。

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

于 2009-07-30T20:17:28.243 回答