Объяснение использования 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;
}
Ответы
Ответ 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.
Ответ 4
Одна ссылка для просмотра:
http://en.wikipedia.org/wiki/Multiple_dispatch
Ответ 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];