在iOS上,从上下文创build一个图层并获取图层的上下文之后,这些上下文又是如何相互关联的?

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

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

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

这有助于了解CGLayer的基本CGLayerCGLayer是一个优化,当你重复绘制相同的内容到一个特定types的上下文。

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

当你创buildCGLayer ,你将它传递给你想要绘制CGLayer的上下文。 这可以让CGLayer为这种情况进行优化。

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

如果您将CGLayer绘制到具有不同格式的上下文中,绘图仍然有效,并且不会出现错误。 但是,如果你直接从这个angular度来理解,它可能不会比以前那么快。

CGLayerCreateWithContext的文档说:

上下文

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

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

CGLayerGetContext的文档说

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

所以你应该期待context != contextOfLayer

同样,API没有具体说明这些上下文是如何相互关联的 – 它们可能会在内部引用对方,也可能不会。 作为API的用户,我们不应该假设任何东西。

具体回答你的问题:

contextOfLayer实际上是上下文的一部分,而上下文有一个图层上下文指针的数组?

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

我认为contextOfLayer不会影响上下文堆栈,所以它只是一个独立的上下文而已?

是的,这是一个独立的环境。 UIKit中的“上下文堆栈”是一个更高层次的概念。 CoreGraphics中的CGLayer是一个低级别的API, CGLayer UIKit一无所知。