Подтвердить что ты не робот

Объяснение использования Cocoa @selector

Я новичок в 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 array of earthquakes.
    [(id)[[UIApplication sharedApplication] delegate]
            performSelectorOnMainThread:@selector(addToEarthquakeList:)
            withObject:self.currentEarthquakeObject waitUntilDone:YES];
    return;
}
4b9b3361

Ответ 1

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

Примеры:

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

[object respondsToSelector:@selector(methodName)]

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

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

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

[object performSelectorOnMainThread:@selector(methodName)]

Ответ 2

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

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

Ответ 3

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

Ответ 5

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

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

- (BOOL)validateMenuItem:(NSMenuItem *)item {
    if ([item action] == @selector(selectFiles:) && otherCondition) {
        return YES;
    } else {
        return NO;
    }
}

Ответ 6

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

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

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

[myObject runMYmethod:parameters];