Это помогает, если вы понимаете обоснование для CGLayer
. CGLayer
понимается как оптимизация, когда вы неоднократно нарисовываете одно и то же содержимое в конкретном контексте.
(Например: растровые контексты с определенным форматом - например, 32-битного RGBA - или PDF контекстов и т.д.)
При создании CGLayer
, вы передаете ему контекст, который вы собираетесь рисовать CGLayer
в. Это позволяет CGLayer
оптимизировать себя для такого контекста.
Позже, если вы нарисуете CGLayer
в этом контексте или в другом контексте, который имеет тот же формат, рисунок будет быстрее.
Если вы нарисуете CGLayer
в контексте с другим форматом, рисунок будет по-прежнему работать, и вы не получите ошибку. Тем не менее, это может быть не так быстро, как было бы, если бы вы просто нарисовали прямо в этом контексте.
documentation for CGLayerCreateWithContext говорит:
контекст
Графический контекст вы хотите создать слой относительно. Слой использует этот графический контекст в качестве ссылки для инициализации .
Это означает, что слой выглядит как заданный context
. Это не обязательно означает, что context
хранится в пределах CGLayer
или на постоянной основе. Это может быть, но вы не можете сказать - это внутренняя деталь реализации.
documentation for CGLayerGetContext говорит
контекст, который возвращается контекст для самого слоя, а не контекст, который вы указали при создании слоя.
Поэтому вы должны ожидать, что context != contextOfLayer
.
Опять же, API не указывает ничего о том, как эти контексты связаны друг с другом - они могут ссылаться друг на друга внутренне, или они могут и не быть. В качестве пользователей API мы ничего не должны принимать.
Чтобы ответить на ваши вопросы конкретно:
Является contextOfLayer фактически часть контекста и контекста имеет массив контекстного слоя указателей?
Мы не знаем, и мы не можем это выяснить. Как пользователи API, мы не должны писать какой-либо код, который так или иначе принимает.
Я думаю, что contextOfLayer не влияет на стек контекста, так что это просто независимый контекст, просто «существует там» сам по себе?
Да, это независимый контекст. «Стек контекста» в UIKit представляет собой концепцию более высокого уровня. CGLayer
в CoreGraphics - это API нижнего уровня, который ничего не знает о UIKit
.
aha, спасибо ... Я хотел знать внутренности, чтобы не зависеть от того, как это реализовано, но просто для того, чтобы понять, как это работает внутри. –
CoreGraphics не является открытым исходным кодом, поэтому нет способа узнать. (Если вы не захотите разобрать библиотеку, которая будет значительной работой). –