Из того, что я узнал до сих пор: в Objective-C вы можете отправлять любое сообщение любому объекту. Если объект действительно реализует правильный метод, он будет выполнен, иначе ничего не произойдет. Это происходит потому, что перед отправкой сообщения Objective-C выполнит responseToSelector .
Надеюсь, что пока я прав.
Я сделал небольшую программу для тестирования, в которой действие вызывается каждый раз при перемещении ползунка. Также для тестирования я установил отправителя на NSButton, но на самом деле это NSSlider. Теперь я спросил объект, ответит ли он на setAlternateTitle . В то время как NSButton подойдет, а NSSlider - нет. Если я запускаю код и сам выполняю responseToSelector , он сообщит мне, что объект не будет реагировать на этот селектор. Если я протестирую что-то еще, например 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?