Objective-C responseToSelector

Из того, что я узнал до сих пор: в 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?

19
задан Slipp D. Thompson 13 May 2015 в 00:41
поделиться