Объяснение использования Какао @selector - PullRequest
24 голосов
/ 12 февраля 2009

Я новичок в Cocoa / Cocoa Touch и работаю над книгой по разработке. Я сталкивался с ситуациями, когда используется оператор @selector (). Я немного растерялся, когда и как должен использоваться оператор @selector (). Может ли кто-нибудь дать краткое и приятное объяснение и пример того, почему он используется и какую пользу он дает разработчику?

Кстати, вот пример кода, взятого с сайта разработки Apple для iPhone, который использует @selector ()

if ([elementName isEqualToString:@"entry"])
{

    parsedEarthquakesCounter++;

    // An entry in the RSS feed represents an earthquake, so create an instance of it.
    self.currentEarthquakeObject = [[Earthquake alloc] init];
    // Add the new Earthquake object to the application's array of earthquakes.
    [(id)[[UIApplication sharedApplication] delegate]
            performSelectorOnMainThread:@selector(addToEarthquakeList:)
            withObject:self.currentEarthquakeObject waitUntilDone:YES];
    return;
}

Ответы [ 6 ]

40 голосов
/ 12 февраля 2009

Оператор селектора предоставляет способ обращения к методу, предоставленному объектом, чем-то похожим на указатель на функцию в C. Это полезно, потому что позволяет разделить процесс вызова методов на объекте. Например, один фрагмент кода может предоставить метод, а другой фрагмент кода может применить этот метод к заданному набору объектов.

Примеры:

Проверка, реализует ли объект определенный метод:

[object respondsToSelector:@selector(methodName)]

Сохранить метод для последующего вызова объекта;

SEL method = @selector(methodName);
[object performSelector:method];

Вызов метода в другом потоке (полезно для работы с графическим интерфейсом).

[object performSelectorOnMainThread:@selector(methodName)]
4 голосов
/ 13 февраля 2009

В дополнение к сказанному вы можете также обернуть @selector в NSInvocation для дальнейшего использования. Вы можете установить аргументы для NSInvocation в течение длительного времени после его создания и активировать его, когда вам нужно, чтобы сообщение было запущено. Это дает вам много силы.

Для ознакомления с концепцией у Скотта Стивенсона есть отличный пост под названием "Динамическая цель-C с NSInvocation" .

2 голосов
/ 18 мая 2010

Одним практическим примером является validateMenuItem метод, при котором элементы меню идентифицируются с их целевыми действиями.

Упрощенный пример:

- (BOOL)validateMenuItem:(NSMenuItem *)item {
    if ([item action] == @selector(selectFiles:) && otherCondition) {
        return YES;
    } else {
        return NO;
    }
}
2 голосов
/ 13 февраля 2009

Одна ссылка для просмотра:

http://en.wikipedia.org/wiki/Multiple_dispatch

2 голосов
/ 12 февраля 2009

@selector() используется каждый раз, когда вам нужно передать имя метода в качестве аргумента другому методу, функции или в качестве значения переменной. Прямая передача имени не работает в target-C.

0 голосов
/ 23 апреля 2014

Вы можете использовать селектор для вызова метода объекта - это обеспечивает основу для реализации шаблона проектирования целевого действия в Какао.

[myObject performSelector:@selector(runMYmethod:) withObject:parameters];

эквивалентно:

[myObject runMYmethod:parameters];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...