Según lo que he aprendido hasta ahora: en Objective-C puede enviar cualquier mensaje a cualquier objeto. Si el objeto implementa el método correcto, se ejecutará, de lo contrario no pasará nada. Esto se debe a que antes de enviar el mensaje, Objective-C realizará respondsToSelector.Objective-C respondsToSelector
Espero tener razón hasta ahora.
Hice un pequeño programa para probar donde se invoca una acción cada vez que se mueve un deslizador. También para probar establezco el remitente a NSButton, pero de hecho es un NSSlider. Ahora le pregunté al objeto si responderá a setAlternateTitle. Mientras que un NSButton lo hará y NSSlider no lo hará. Si ejecuto el código y lo hago respondsToSelector mismo me dirá que el objeto no responderá a ese selector. Si pruebo algo más como intValue, responderá. Entonces mi código está bien hasta ahora.
- (IBAction)sliderDidMove:(id)sender
{
NSButton *slider = sender;
BOOL responds =
[slider respondsToSelector:@selector(setAlternateTitle)];
if(responds == YES)
{
NSLog(@"YES");
}
else
{
NSLog(@"NO");
}
[slider setAlternateTitle:@"Hello World"];
}
Pero cuando realmente enviar el mensaje setAlternateTitle el programa se bloqueará y no estoy exactamente seguro de por qué. ¿No debería hacer un respondsToSelector antes de enviar el mensaje?
+1 para esta excelente explicación. ¿Puede proporcionar algún enlace donde todo este proceso esté documentado en detalle? Vale la pena leer – taskinoor
Los documentos están aquí: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html en parte ... Otras cosas están en la referencia de clase NSObject – Psycho
por cierto , 'forwardingTargetForSelector:' está solo en Mac OS X 10.6+ o iOS 4+ – user102008