Сегодня я столкнулся с интересной проблемой iOS, связанной с CATiledLayer. Это происходит только на устройстве, а не на симуляторе.
Мое представление рисует в своем CALayer с помощью обратного вызова делегата drawLayer: inContext:. Этот слой имеет производный от CATiledLayer подслой, который выполняет собственный рисунок в переопределенном drawInContext: метод.
Оба слоя визуализируют содержимое PDF через CGContextDrawPDFPage (). (CALayer рисует версию с низким разрешением, в то время как подслой CATiledLayer рисует контент с высоким разрешением поверх.)
Я столкнулся со сценарием, в котором мне нужно было бы закончить представление - удалить его из суперпредставления и выпустить. dealloc () вызывается в представлении. Некоторое время спустя, системный метод вызывал drawInContext: метод CATiledLayer (в фоновом потоке). Он будет рисовать, но при возврате из метода Springboard будет аварийно завершать работу, и при этом также будет закрываться мое приложение.
Я исправил это, установив флаг в CATiledLayer, сказав, чтобы он больше не рендерился из метода dealloc представления.
Но я могу только представить, что есть более элегантный способ. Почему же CATiledLayer drawInContext: метод по-прежнему вызывался после родительского уровня, а представление родительского уровня было освобождено? Как правильно закрыть представление, чтобы этого не произошло?