Являются ли селекторы в Objective-C просто еще одним способом отправить сообщение объекту? Я действительно не понимаю, почему или как их использовать.
Они не являются другим способом послать сообщение объекту, это единственный способ. Например, в [myView setValue:@"foo"]
, setValue:
- это селектор. (Другой, менее удобный способ написать то же самое - objc_msgSend(myView, @selector(setValue:), @"foo")
.)
Как говорит Ян Генри, вы можете использовать значения SEL
для выбора селектора во время выполнения, а не во время компиляции. Это фундаментальная техника в Cocoa; пользовательские интерфейсы обычно связаны с контроллерами с помощью привязок target/action, где target - это объект, а action - селектор. Обычно это задается в nib, но можно сделать и в коде:
[myButton setTarget:myController];
[myButton setAction:@selector(buttonClicked:)]; // Clicking the button will now call [myController buttonClick:myButton].
В большинстве случаев да, но вы можете изменить сообщение во время выполнения. Например:
SEL a = [selectorFactory getSelector];
[someOtherObject performSelector:a];
А затем в selectorFactory.getSelector
:
if(foo == 1)
return @selector(thisSelector);
else
return @selector(thatSelector);
Исходя из C #
или другого подобного языка, вы можете использовать это (в общих чертах) для моделирования событий намного проще, чем с использованием NSNotification
s. Например, вы можете создать класс кнопки с двумя ivar, target
и selector
, и заставить кнопку выполнять селектор на цели при нажатии (например).
Однако селекторы - это гораздо больше. Подробнее о них читайте здесь: