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