Работая над небольшим проектом, я обнаружил, что мне нужно сделать какой-то пользовательский чертеж через drawRect:
в одном из моих подклассов UIView
. Я заметил, что когда я переопределил drawRect:
, что цвет фона по умолчанию для подкласса UIView
изменился с прозрачного на черный (по умолчанию цвет фона означает цвет, который вид рисует сам, когда его свойство backgroundColor
равно нулю). Даже с пустым drawRect:
или drawRect:
что просто вызывает [super drawRect:]
Я заметил это поведение.Можно ли определить, перекрыл ли подкласс метод?
Это не проблема, так как просто установка backgroundColor
на значение, отличное от нуля, независимо от того, переопределено ли значение drawRect:
. Тем не менее, это заставило меня задуматься о том, как UIView
знает, переопределен ли drawRect:
подклассом. Я знаю, что Objective-C предлагает средства для определения того, реагирует ли класс или даже его суперкласс на определенный селектор. Но как мог суперкласс, возможно, знать, заменил ли его подкласс один из его методов? И если этот тип самоанализа действительно невозможно, что может происходить в моем примере?
Да, поведение, на удивление, сохраняется даже при простом вызове супер. Я (глупо) проигнорировал возможность выполнения obj-c, потому что я понял, что любые функции, используемые для получения методов класса, также учитывают методы суперкласса (так что всегда будет drawRect: present.) Но class_copyMethodList (..., ...) функция (и, возможно, другие?), похоже, исключает методы суперкласса, поэтому я предполагаю, что UIView может перебирать этот список, чтобы искать drawRect: в подклассе. Думаю, тогда возникает вопрос, действительно ли это происходит. Большое спасибо за ваш вклад. – Sam