引用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),或者通过网络再次请求它(慢)。
我的想法是,我需要把我的图像定格到一个数据库中,每当屏幕上出现一个视图时,我就重新获取它们--但我很想听听人们对此的想法。
发布于 2009-07-30 20:17:28
在这里,将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将缓存您所绘制的内容,这样您就不会不断地重绘相同的东西。它实际上与添加subViews无关。
Quartz缓存可重用的任何对象,包括CGLayer对象.
https://stackoverflow.com/questions/1207798
复制相似问题