我们可以从当前图形上下文创建一个图层,然后获取该图层的上下文:
CGContextRef context = UIGraphicsGetCurrentContext();
CGLayerRef layer = CGLayerCreateWithContext(context,
CGSizeMake(self.frame.size.width,
self.frame.size.height), NULL);
CGContextRef contextOfLayer = CGLayerGetContext(layer);
所以我们现在有 2 个上下文:context
和 contextOfLayer
. 这两种背景如何相互关联? contextOfLayer
实际上是context
的一部分,并且context
具有图层上下文指针数组吗? 如果我使用 NSLog(@"%p", ...)
打印出它们的地址,它们具有不同的地址,因此它们不是同一个对象。 而且我认为contextOfLayer
不会影响上下文堆栈,那么它是否只是一个独立的上下文,只是本身"存在"?
如果您了解CGLayer
的基本原理,它会有所帮助。 当您将相同的内容重复绘制到特定类型的上下文中时,CGLayer
意味着优化。
(例如:具有特定格式的位图上下文 - 例如 32 位 RGBA - 或 PDF 上下文等(
创建 CGLayer
时,将要绘制CGLayer
的上下文传递给它。 这使CGLayer
可以针对这种上下文进行自我优化。
稍后,如果将CGLayer
绘制到该上下文或具有相同格式的其他上下文中,则绘制速度会更快。
如果将CGLayer
绘制到具有不同格式的上下文中,则绘制仍将有效,并且不会收到错误。但是,它可能不会比您直接绘制到该上下文中时更快。
CGLayerCreateWithContext的文档说:
上下文
要创建相对于其创建的图层的图形上下文。 图层使用此图形上下文作为 初始化。
这意味着图层将给定context
视为参考。这并不一定意味着context
存储在CGLayer
中或永久引用。可能是,但你无法判断 - 这是一个内部实现细节。
CGLayerGetContext的文档说
返回的上下文是图层本身的上下文,而不是您在创建图层时指定的上下文。
所以你应该期待context != contextOfLayer
.
同样,API 没有指定任何关于这些上下文如何相互关联的内容——它们可能在内部相互引用,也可能不引用。作为API的用户,我们不应该假设任何事情。
具体回答您的问题:
contextOfLayer 实际上是上下文的一部分,并且上下文具有层上下文指针数组吗?
我们不知道,也找不到。作为 API 的用户,我们不应该编写任何假设这样或那样的代码。
我认为contextOfLayer不会影响上下文堆栈,那么它只是一个独立的上下文,只是自己"存在"吗?
是的,这是一个独立的背景。UIKit 中的"上下文堆栈"是一个更高层次的概念。 CoreGraphics 中的CGLayer
是一个较低级别的 API,对UIKit
一无所知。