首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >石英缓存CGLayer

石英缓存CGLayer
EN

Stack Overflow用户
提问于 2009-07-30 16:40:04
回答 1查看 1.1K关注 0票数 1

引用CGLayer文档:

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

我在大页面上的内存有问题,并试图实现一种简单的机制,根据视图是否在屏幕上/离开屏幕上发布和重新创建视图。

为了简单起见,假设我有一堆UIImages,它们是作为网络请求的结果创建的,保存在某个数组中。我创建一个类似于这样的UIImageView:

代码语言:javascript
复制
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),或者通过网络再次请求它(慢)。

我的想法是,我需要把我的图像定格到一个数据库中,每当屏幕上出现一个视图时,我就重新获取它们--但我很想听听人们对此的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-30 20:17:28

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

代码语言:javascript
复制
UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];

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

代码语言:javascript
复制
[mainView addSubview:imgView]; // Quartz eats memory for view after first draw

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

代码语言:javascript
复制
[imgView release]; // owned by mainView now

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

下面一行的意思是,如果您以编程方式绘制到您的CGLayer,那么Quartz将缓存您所绘制的内容,这样您就不会不断地重绘相同的东西。它实际上与添加subViews无关。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1207798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档