Прежде всего, имя метода (его селектор) включает все части и символы двоеточия, как сказал mvds.
Во-вторых, метод -respondsToSelector:
не вызывается средой выполнения, он обычно вызывается пользователем (вами или API, которые хотят знать, например, отвечает ли делегат на необязательный метод протокола).
Когда вы отправляете сообщение объекту, среда выполнения будет искать реализацию метода в классе объекта (через указатель isa объекта). Это эквивалентно отправке -respondsToSelector:
, хотя само сообщение не отправляется. Если реализация метода найдена в классе или в его суперклассах, он вызывается со всеми переданными вами аргументами.
Если нет, то среда выполнения дает сообщению второй шанс быть выполненным. Он начнется с отправки сообщения + (BOOL)resolveInstanceMethod:(SEL)name
классу объекта: этот метод позволяет добавить метод во время выполнения к классу: если это сообщение возвращает YES, это означает, что оно может повторно отправить сообщение.
Если это не дает сообщению третий шанс быть выполненным, он отправляет - (id)forwardingTargetForSelector:(SEL)aSelector
с помощью селектора, этот метод может вернуть другой объект, который может быть в состоянии ответить селектору от имени фактического получателя, если возвращено объект может ответить, метод выполняется и значение возвращается так, как если бы оно было возвращено исходным сообщением. (Примечание: это доступно начиная с OS X 10.6 или iOS 4.)
Если возвращаемый объект имеет значение nil или self (чтобы избежать бесконечных циклов), среда выполнения дает сообщению четвертый шанс выполнить метод ... Он отправляет сообщение - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
, чтобы получить сигнатуру метода для построения вызова. Если он указан, то вызов отправляется через сообщение - (void)forwardInvocation:(NSInvocation *)anInvocation
. В этом методе вы можете анализировать вызов и создавать другие сообщения для отправки другим целям любым удобным для вас способом, а затем вы можете установить возвращаемое значение вызова ... Это значение будет действовать как возвращаемое значение исходного сообщения.
Наконец, если объект не возвращает сигнатуру метода, тогда среда выполнения отправляет сообщение - (void)doesNotRecognizeSelector:(SEL)aSelector
вашему объекту, реализация этого метода в классе NSObject выдает исключение.