SEL est un type qui représente un sélecteur en Objective-C. @selector() mot-clé renvoie à SEL que vous décrivez. Ce n'est pas un pointeur de fonction et vous ne pouvez pas passer les objets ou les références de tout genre. Pour chaque variable dans le sélecteur (méthode de), vous devez vous représenter que, dans l'appel à @sélecteur. Par exemple:
-(void)methodWithNoArguments;
SEL noArgumentSelector = @selector(methodWithNoArguments);
-(void)methodWithOneArgument:(id)argument;
SEL oneArgumentSelector = @selector(methodWithOneArgument:); // notice the colon here
-(void)methodWIthTwoArguments:(id)argumentOne and:(id)argumentTwo;
SEL twoArgumentSelector = @selector(methodWithTwoArguments:and:); // notice the argument names are omitted
Les sélecteurs sont généralement transmis à déléguer à des méthodes et à des rappels à préciser la méthode qui doit être appelée sur un objet spécifique lors d'un rappel. Par exemple, lorsque vous créez une minuterie, la méthode de rappel est défini comme étant:
-(void)someMethod:(NSTimer*)timer;
Ainsi, lorsque vous programmez la minuterie vous utilisez @sélecteur de spécifier la méthode sur votre objet sera réellement responsable pour le rappel:
@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;
}
Dans ce cas, vous indiquez que l'objet obj être messaged avec myTimerCallback toutes les 30 secondes.