2011-09-17 38 views
0

这是一个假设性的问题,但我可以想象这种情况在未来某个时刻会出现:让我们假设我有一个奇怪复杂的UIViews层次结构,我只需渲染一次。我们还假设,一旦绘制完成,我不再使用父视图下的信息(UIImages,标签,自定义视图,坐标等)。而不是保留它们,这个想法是释放他们使用的所有额外的内存,而避免重绘。结果与绘制到屏幕外的缓冲区然后将其推送到屏幕上相同。是否有可能使用开箱即用的UIView/CGLayer,或者是将父CGLayer的内容转换为UIImage的唯一选择?如何删除UIView子视图w/out强制重绘?

只是好奇。我想在大多数情况下,保留一些额外视图的开销可以忽略不计,但是内存是内存,除了分配位图之外,我还没有能够在官方文档中找到任何内容。

谢谢!

回答

0

这让我觉得很危险。无法控制的事情可能会发生,需要重新绘制视图,例如出现通知或视图受到屏幕顶部的电话活动绿色栏的影响。

我建议如果在层次结构中有很多视图,那么会出现许多其他性能问题,这些问题在重绘后保存几个字节将成为问题中最少的。

+0

谢谢,这几乎是我在实际开发事物方面着手的内容,但是从纯粹假设的POV来看,我仍然很好奇如果这样的解决方案甚至是可能的。另外,对于迟到的回应感到遗憾 - 看起来这些电路板上的通知邮件正在某处被吃掉。 –

+0

坦率地说,我不知道有一种方法可以做到这一点,而不是对结果视图进行“截图”,并用单个图像视图替换整个层次结构。如果视图需要重绘,那么释放备份视图的所有数据将很容易,然后检索该数据。像Ariel在下面说的,重写drawRect很容易导致怪异的缺陷。 –

0

我可以考虑重写-(void)drawRect:(CGRect)rect;方法,根据一些布尔标志将图像移动到屏幕之前只画一次离屏,但它可能会导致一个巨大的错误,应该正确地设计。另一件事是,它也可能导致-(void)layoutSubviews;被覆盖,认为它可能是开销,如果你已经覆盖了第一个...