Зачем объявлять метод в категории без его реализации? - PullRequest
1 голос
/ 07 апреля 2009

Я читаю исходный код проекта с открытым исходным кодом, и я обнаружил следующее определение категории в файле реализации:

@interface QCView (Private)
- (void)_pause;
- (void)setClearsBackground:(BOOL)flag;
@end

Сначала я подумал, что setClearsBackground метод добавляет к определению класса QCView. Но когда я ищу в этом файле реализации, я не вижу реализации метода setClearsBackground (хотя это сообщение отправляется экземпляру QCView в нескольких местах файла).

Зачем кому-то объявлять метод в классе инфраструктуры, подобном QCView, но тогда нигде не реализовывать этот метод? Я могу только предположить, что это способ обойти компилятор и вызвать метод, который не объявлен в файле QCView.h. Но это кажется маловероятным, потому что как разработчик узнает, что реализация этого метода вообще существует?

1 Ответ

6 голосов
/ 07 апреля 2009

Разработчик, вероятно, использовал такой инструмент, как class-dump , чтобы генерировать заголовки, в которых перечисляются все методы, реализованные платформой. Это полезно, если вам нужен доступ к SPI и у вас нет другого выбора. Без объявления Objective-C делает предположения о параметрах метода и, помимо генерации предупреждения, может генерировать неправильный вызов метода.

Применяются все обычные предостережения о недокументированном нарушении интерфейса в будущей версии ОС. Как минимум, вы должны проверить, отвечает ли объект на этот метод (-[NSObject respondsToSelector]). Для дополнительной паранойи вы можете заключить вызов в блок исключения, если метод остался, но его поведение изменилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...