我们可以从当前图形上下文创建一个图层,然后获取图层的上下文:
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
不会影响上下文堆栈,因此它只是一种独立的上下文,只是存在于那里"本身?
答案 0 :(得分:3)
如果您了解CGLayer
的基本原理,这会有所帮助。当您将相同内容重复绘制到特定类型的上下文中时,CGLayer
意味着优化。
(例如:具有特定格式的位图上下文 - 例如32位RGBA - 或PDF上下文等)
创建CGLayer
时,会将您想要绘制CGLayer
的上下文传递给它。这使得CGLayer
可以针对这种情境优化自身。
稍后,如果绘制的CGLayer
到这方面,或者到具有相同的格式不同的情况下,该图将会更快。
如果您将CGLayer
绘制到具有不同格式的上下文中,则绘图仍然有效,并且您不会收到错误。但是,它可能不会比你刚刚直接进入上下文时更快。
documentation for CGLayerCreateWithContext说:
context
要创建相对于图层的图形上下文。 该图层使用此图形上下文作为参考 初始化。
这意味着图层会将给定的context
视为参考。它并不一定意味着context
存储在CGLayer
中,或永久引用。它可能是,但你不能说 - 这是一个内部实现细节。
documentation for CGLayerGetContext说
返回的上下文是图层本身的上下文,而不是您在创建图层时指定的上下文。
所以你应该期待context != contextOfLayer
。
同样,API没有详细说明这些上下文如何相互关联 - 它们可能在内部相互引用,也可能不引用。作为API的用户,我们不应该做任何事情。
具体回答您的问题:
contextOfLayer实际上是上下文的一部分,上下文是否有一个层上下文指针数组?
我们不知道,也无法找到答案。作为API的用户,我们不应该编写任何采用这种或那种方式的代码。
我觉得contextOfLayer不影响上下文堆栈,所以它只是一个独立的情况下只是一种本身“存在在那里?”
是的,这是一个独立的背景。 UIKit中的“上下文堆栈”是一个更高级别的概念。 CoreGraphics中的CGLayer
是一个较低级别的API,对UIKit
一无所知。