引用 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 到数据库中,并在每次屏幕出现视图时重新获取它们——但我很想听听人们对此的想法。