代码之家  ›  专栏  ›  技术社区  ›  Sam

石英缓冲层

  •  1
  • Sam  · 技术社区  · 16 年前

    要引用CGLayer文档,请执行以下操作:

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

    为了简单起见,我有一堆UIImage,它们是根据网络请求创建的,保存在某个数组中。我创建了一个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 然后被释放。好吧?否-石英中存在的CGE层未被移除,因为 anImage 仍然存在。

    我怎样才能避开这件事?在这种情况下,唯一的方法是在Quartz的背后创建一个完全相同的映像,并使用不同的指针地址,然后删除旧映像。要做到这一点,唯一的方法是“深度复制”映像(UIImage不实现NSCoding)或通过网络再次请求它(缓慢)。

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

    1 回复  |  直到 16 年前
        1
  •  1
  •   amattn    16 年前

    这里将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
    

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