Являются ли селекторы в Objective-C просто еще одним способом отправить сообщение объекту? - PullRequest
6 голосов
/ 23 августа 2010

Являются ли селекторы в Objective-C еще одним способом отправки сообщения объекту? Я действительно не понимаю, почему или как их использовать.

Ответы [ 5 ]

21 голосов
/ 26 февраля 2012

Селекторы обычно используются, когда вы хотите определить механизм обратного вызова. Наиболее распространенный вариант использования селекторов в Какао - элементы управления, такие как кнопки. A UIButton является очень общим и не имеет представления о том, что должно произойти при нажатии кнопки. Прежде чем вы сможете использовать один, вам нужно сказать ему, какой метод должен быть запущен при нажатии кнопки. Это делается следующим образом:

[myButton addTarget:self
             action:@selector(myButtonWasPressed)
   forControlEvents:UIControlEventTouchUpInside];

- (void)myButtonWasPressed {
    // Do something about it
}

Затем, когда кнопка нажата, кнопка вызовет селектор на цели, которую мы передали. Благодаря этому механизму вам не нужно создавать подкласс для кнопки каждый раз, когда вы хотите, чтобы она вызывала некоторый ваш собственный код. Вместо этого UIButton сам по себе имеет общий механизм для отправки любого кода по вашему выбору. (Ладно, технически это суперкласс UIControl, который обеспечивает механизм отправки.)

16 голосов
/ 23 августа 2010

Это не другой способ отправить сообщение объекту, это единственный способ.Например, в [myView setValue:@"foo"], setValue: является селектором.(Другой, менее удобный способ написать то же самое - objc_msgSend(myView, @selector(setValue:), @"foo").)

Как говорит Ян Генри, вы можете использовать значения SEL, чтобы выбрать селектор во время выполнения вместо компиляции.Это фундаментальный метод в какао;пользовательские интерфейсы, как правило, подключаются к контроллерам с помощью привязок «цель / действие», где цель - это объект, а действие - селектор.Обычно вы устанавливаете это в перо, но вы также можете сделать это в коде:

[myButton setTarget:myController];
[myButton setAction:@selector(buttonClicked:)]; // Clicking the button will now call [myController buttonClick:myButton].
4 голосов
/ 26 февраля 2012

Вы можете хранить селекторы как переменные и вызывать их позже или в другом контексте. Например, вы можете указать объекту выполнить селектор в определенное время или в другом потоке. Вы также можете выбрать, какой селектор выполнять, основываясь на данных, и именно так делают построитель интерфейса и данные ядра.

3 голосов
/ 23 августа 2010

В большинстве случаев да, но вы можете изменить сообщение во время выполнения. Например:

SEL a = [selectorFactory getSelector];
[someOtherObject performSelector:a];

А потом в selectorFactory.getSelector:

if(foo == 1)
    return @selector(thisSelector);
else
    return @selector(thatSelector);

Исходя из C# или другого подобного языка, вы можете использовать его для (свободного) моделирования событий гораздо легче, чем при использовании NSNotification s. Например, вы можете создать класс кнопок с двумя иварами target и selector и заставить кнопку выполнять селектор на цели при ее нажатии (например).

Хотя селекторов гораздо больше, чем это. Подробнее о них читайте здесь:

http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/articles/ocSelectors.html

0 голосов
/ 03 февраля 2015

- из библиотеки разработчика Apple -

Селектор - это имя, используемое для выбора метода для выполнения объекта, или уникальный идентификатор, который заменяет имя при компиляции исходного кода. Селектор сам по себе ничего не делает. Это просто определяет метод. Единственное, что отличает имя метода селектора от простой строки, это то, что компилятор обеспечивает уникальность селекторов. Что делает селектор полезным, так это то, что (в сочетании со временем выполнения) он действует как указатель динамической функции, который для данного имени автоматически указывает на реализацию метода, подходящего для любого класса, с которым он используется. Предположим, у вас есть селектор для запуска метода и классы Dog, Athlete и ComputerSimulation (в каждом из которых реализован метод run). Селектор может использоваться с экземпляром каждого из классов для вызова его метода run, даже если реализация может отличаться для каждого.

...