Respuestas:
También está el mensaje estático instanceRespondToSelector: (SEL) selector Lo llamaría así:
[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]
o así:
[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]
Esto puede ser útil si desea llamar a un constructor u otro dependiendo de esto (quiero decir, antes de tener la instancia en sí).
Utilice respondsToSelector:
. De la documentación :
respondeToSelector:
Devuelve un valor booleano que indica si el receptor implementa o hereda un método que puede responder a un mensaje específico.
- (BOOL)respondsToSelector:(SEL)aSelector
Parámetros
aSelector : un selector que identifica un mensaje.Valor de retorno
YES
si el receptor implementa o hereda un método que puede responder a aSelector , en caso contrarioNO
.
Estás buscando respondsToSelector: -
if ([foo respondsToSelector: @selector(bar)] {
[foo bar];
}
Como dice Donal, lo anterior te dice que foo definitivamente puede manejar la recepción del selector de barras. Sin embargo, si foo es un proxy que reenvía la barra a algún objeto subyacente que recibirá el mensaje de barra, entonces respondeToSelector: le dirá NO, aunque el mensaje se reenviará a un objeto que responde a la barra.
La verificación de selectores con respondsToSelector es normalmente solo para métodos delegados. No debería utilizar forwardInvocation o proxies para los métodos delegados. Si necesita utilizar respondsToSelector en otras situaciones, es posible que desee asegurarse de que no haya una forma más adecuada de diseñar su programa.
- forwardInvocation:
).