Como kubi mencionó respondsToSelector
se usa normalmente cuando tiene una instancia de un método que se ajusta a un protocolo.
// Extend from the NSObject protocol so it is safe to call `respondsToSelector`
@protocol MyProtocol <NSObject>
// @required by default
- (void) requiredMethod;
@optional
- (void)optionalMethod;
@end
Dado e instancia de este protocolo podemos llamar de forma segura a cualquier método requerido.
id <MyProtocol> myObject = ...
[myObject requiredMethod];
Sin embargo, los métodos opcionales pueden o no implementarse, por lo que debe verificar en tiempo de ejecución.
if ([myObject respondsToSelector:@selector(optionalMethod)])
{
[myObject optionalMethod];
}
Esto evitará un bloqueo con un selector no reconocido.
Además, la razón por la que debe declarar protocolos como una extensión de NSObjects, es decir
@protocol MyProtocol <NSObject>
se debe a que el protocolo NSObject declara el selector respondsToSelector:
. De lo contrario, XCode pensaría que no es seguro llamarlo.
gracias. Entiendo ahora.Noté que usas self.delegate, que es una propiedad. Solo uso una variable de instancia: delegado id. ¿cual es la diferencia? Estoy aprendiendo objetivo-c. gracias de nuevo – Taho
'self.delegate' es exactamente lo mismo que llamar' [self delegate] '. En mi código no hay diferencia entre '[self.delegate someMethod]' y '[_delegate someMethod]', pero tiendo a usar sintaxis de punto porque mantiene en mi mente las variables que son locales para el método en el que estoy y que son variables de instancia. – kubi
Si recién está comenzando, valdrá la pena leer la guía de Apple para Obj-C. http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html%23//apple_ref/doc/uid/TP30001163-CH17 – kubi