Вы правы в том, что по умолчанию этот CALayer drawInContext:
ничего не делает. Это верно, если уровень не имеет делегата и , который делегат уровня реализует drawLayer:inContext:
. Таким образом, проблема с документацией заключается в том, что рядом с утверждением «Реализация по умолчанию ничего не делает» должна стоять небольшая звездочка.
Помните, что все представления поддерживаются каким-либо CALayer. Этот слой автоматически настраивается так, чтобы его вид был установлен в качестве делегата. Что не очевидно на первый взгляд, так это то, что UIView реализует делегат CALayer drawLayer:inContext:
. Это то, что вы видите со всеми этими вызовами в стеке вызовов.
Ваш экземпляр AlarmIntervalView автоматически имеет резервный слой, а этому базовому слою назначен делегат для вашего экземпляра AlarmIntervalView. Некоторая часть системы вызывает вспомогательный слой drawInContext:
, который проверяет наличие делегата (который у него есть), отправляет делегата respondsToSelector:
с drawLayer:inContext:
в качестве аргумента (на который UIView действительно отвечает) и, наконец, фактически отправляет сообщение drawLayer:inContext:
. Реализация UIView drawLayer:inContext:
вызывает ваш взгляд drawRect:
.
Я не совсем уверен, почему вы упоминаете о мерзости.
[Мой ответ длинный, в основном для моей пользы. Это тоже помогает мне учиться.]