2011-02-06 2 views
2

Работая над небольшим проектом, я обнаружил, что мне нужно сделать какой-то пользовательский чертеж через drawRect: в одном из моих подклассов UIView. Я заметил, что когда я переопределил drawRect:, что цвет фона по умолчанию для подкласса UIView изменился с прозрачного на черный (по умолчанию цвет фона означает цвет, который вид рисует сам, когда его свойство backgroundColor равно нулю). Даже с пустым drawRect: или drawRect: что просто вызывает [super drawRect:] Я заметил это поведение.Можно ли определить, перекрыл ли подкласс метод?

Это не проблема, так как просто установка backgroundColor на значение, отличное от нуля, независимо от того, переопределено ли значение drawRect:. Тем не менее, это заставило меня задуматься о том, как UIView знает, переопределен ли drawRect: подклассом. Я знаю, что Objective-C предлагает средства для определения того, реагирует ли класс или даже его суперкласс на определенный селектор. Но как мог суперкласс, возможно, знать, заменил ли его подкласс один из его методов? И если этот тип самоанализа действительно невозможно, что может происходить в моем примере?

ответ

0

Это довольно странно (но похоже, что это предназначено). Просто добавьте:

- (void) drawRect:... 
{ 
    [super drawRect:...]; 
} 

Запускает поведение? Атипичная. В любом случае тривиально использовать API-интерфейс Objective-C для интроспекции подробных сведений о реализации класса. См. Objective-C runtime reference.

UIView's documentation for -drawRect: подробно рассказывает о подклассе. В нем совершенно определенно указано, что вам не нужно называть супер, когда прямо подклассифицируется UIView, что указывает на то, что класс, вероятно, оптимизирован для выполнения минимального количества дополнительной работы (например, рисование фона, полностью уничтоженного в вашей реализации).

+0

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

Смежные вопросы