2010-04-18 3 views

ответ

4

Во-первых, да, метод действительно должен существовать для проверки, чтобы преуспеть в контексте, который вы описываете. respondsToSelector: вернет NO, если метод не реализован.

Что еще более важно, я думаю, вы имеете в виду чистую виртуальную функцию бедного человека в Objective-C. Все методы экземпляра являются «виртуальными» в Objective-C; поскольку поиск метода выполняется во время выполнения, реализация подкласса всегда будет использоваться даже из указателя типа суперкласса. В Objective-C нет такого понятия, как чистый виртуальный базовый класс. Вы часто можете достичь того, чего хотите, либо используя @protocol, чтобы определить API, либо использовать базовый класс, который обеспечивает реализацию, которая создает в качестве своего тела NSNotImplementedException. Очевидно, что подклассы должны переопределять реализацию, делая ее фактически чистой виртуальной.

+0

Возможно, вы хотите отредактировать первую строку. Технически говоря, методы не должны существовать. В конце концов 'отвечаетSoSelector:' единственная цель - определить, существует ли метод или нет. Он отлично работает с несуществующими методами, он просто возвращает нет. Я думаю, что вы отвечаете, имеет смысл в предполагаемом контексте родителя, но для будущих читателей вы, возможно, захотите сделать различие явным. – TechZen

+0

@TechZen Хорошая точка. Ред. –

1

responsesToSelector вернет NO, поскольку селектор не может быть вызван во время выполнения. Часть интерфейса влияет только на компиляцию.

2

Учитывая, что вызов respondsToSelector: имеет смысл только тогда, когда вы не знаете, существует ли метод, не совсем понятно, что вы имеете в виду.

Если вы имеете в виду, то некоторая реализация метода с указанным селектором должна где-то существовать, ответ - нет. Селекторы просто представляют собой имена методов. Директива @selector не ссылается ни на какой аспект любой реализации метода.