3

我们可以从当前图形上下文创建一个图层,然后获取图层的上下文:

CGContextRef context = UIGraphicsGetCurrentContext();

CGLayerRef layer = CGLayerCreateWithContext(context, 
                                            CGSizeMake(self.frame.size.width,
                                                self.frame.size.height), NULL);

CGContextRef contextOfLayer = CGLayerGetContext(layer);

所以我们现在有 2 个上下文:contextcontextOfLayer. 这两种情况如何相互关联?contextOfLayer实际上是层上下文指针数组的context一部分吗?context如果我使用 打印出它们的地址NSLog(@"%p", ...),它们有不同的地址,所以它们不是同一个对象。而且我认为contextOfLayer不会影响上下文堆栈,所以它只是一个独立的上下文本身就“存在于那里”吗?

4

1 回答 1

3

如果您了解CGLayer. CGLayer当您将相同的内容重复绘制到特定类型的上下文中时,这意味着一种优化。

(例如:具有特定格式的位图上下文 - 例如 32 位 RGBA - 或 PDF 上下文等)

创建 时CGLayer,将要绘制的上下文传递给它CGLayer。这可以让CGLayer优化自身针对这种上下文进行优化。

稍后,如果您将其绘制CGLayer到该上下文中,或者绘制到具有相同格式的不同上下文中,则绘制速度会更快。

如果您将 a 绘制CGLayer到具有不同格式的上下文中,绘图仍然可以工作,并且您不会收到错误。但是,如果您直接进入该上下文,它可能不会比它更快。

CGLayerCreateWithContext的文档说:

语境

要相对于创建图层的图形上下文。该层使用此图形上下文作为初始化的参考。

这意味着该层将给定context的内容作为参考。这并不一定意味着context存储在 中CGLayer,或永久引用。可能是这样,但你不能说——这是一个内部实现细节。

CGLayerGetContext的文档说

返回的上下文是图层本身的上下文,而不是您在创建图层时指定的上下文。

所以你应该期待context != contextOfLayer

同样,API 没有指定任何关于这些上下文如何相互关联的内容——它们可能在内部相互引用,也可能不相互引用。作为 API 的用户,我们不应该假设任何事情。

具体回答您的问题:

contextOfLayer 实际上是上下文的一部分,并且上下文具有层上下文指针数组吗?

我们不知道,也找不到。作为 API 的用户,我们不应该编写任何假定一种或另一种方式的代码。

我认为 contextOfLayer 不会影响上下文堆栈,所以它只是一个独立的上下文,只是一种“存在于那里”本身?

是的,它是一个独立的上下文。UIKit 中的“上下文栈”是一个更高层次的概念。CGLayer在 CoreGraphics 中是一个较低级别的 API,它对UIKit.

于 2012-05-20T18:14:07.457 回答