SEL - это тип, представляющий селектор в Objective-C. Ключевое слово @selector () возвращает описанный вами SEL. Это не указатель на функцию, и вы не можете передавать ему какие-либо объекты или ссылки любого рода. Для каждой переменной в селекторе (методе) вы должны представить это в вызове @selector. Например:
-(void)methodWithNoParameters;
SEL noParameterSelector = @selector(methodWithNoParameters);
-(void)methodWithOneParameter:(id)parameter;
SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here
-(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo;
SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted
Селекторы обычно передаются методам делегирования и обратным вызовам, чтобы указать, какой метод следует вызывать для определенного объекта во время обратного вызова. Например, когда вы создаете таймер, метод обратного вызова специально определяется как:
-(void)someMethod:(NSTimer*)timer;
Поэтому, когда вы планируете таймер, вы должны использовать @selector, чтобы указать, какой метод на вашем объекте будет фактически отвечать за обратный вызов:
@implementation MyObject
-(void)myTimerCallback:(NSTimer*)timer
{
// do some computations
if( timerShouldEnd ) {
[timer invalidate];
}
}
@end
// ...
int main(int argc, const char **argv)
{
// do setup stuff
MyObject* obj = [[MyObject alloc] init];
SEL mySelector = @selector(myTimerCallback:);
[NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES];
// do some tear-down
return 0;
}
В этом случае вы указываете, что объект obj будет обмениваться сообщениями с myTimerCallback каждые 30 секунд.