Можно сказать, переопределил ли подкласс метод? - PullRequest
2 голосов
/ 06 февраля 2011

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

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

1 Ответ

0 голосов
/ 06 февраля 2011

Это довольно странно (но звучит так, как будто задумано).Просто добавив:

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

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

Документация UIView для -drawRect: содержит значительные сведения о подклассах.В нем совершенно точно говорится, что вам не нужно вызывать super при непосредственном создании подкласса UIView, что указывает на то, что класс, вероятно, оптимизирован для выполнения минимального объема дополнительной работы (например, отрисовка фона, полностью уничтоженного в вашей реализации).1012 *

...