根据我目前所学:在Objective-C中,您可以向任何对象发送任何消息。如果对象实现了正确的方法,则该方法将被执行;否则,什么也不会发生。这是因为在发送消息之前,Objective-C会执行respondsToSelector。
到目前为止我希望我的理解是正确的。
我写了一个小程序进行测试,在滑块移动时调用一个操作。同时为了测试,我将sender设置为NSButton,但实际上它是NSSlider。现在我询问对象是否会响应setAlternateTitle。当NSButton会响应而NSSlider不会响应。如果我运行代码并自己使用respondsToSelector进行测试,则会告诉我对象不会响应该选择器。如果我测试其他东西(如intValue),它将会响应。到目前为止,我的代码是正确的。
- (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"];
}
但是当我发送setAlternateTitle消息时,程序会崩溃,我不确定原因。难道不应该在发送消息之前使用respondsToSelector吗?
forwardingTargetForSelector:
只在 Mac OS X 10.6+ 或 iOS 4+ 中存在。 - user102008