Objective-C : les fondamentaux pour le développement iOS 6 Les sélecteurs en Objective-C : des pointeurs sur fonction

Objective-C étant un langage très dynamique, il est souvent utile de passer à une méthode un pointeur sur une fonction qui sera rappelée ultérieurement. Un sélecteur est un identifiant unique de méthode.

Le mot-clé @selector est ajouté en Objective-C pour obtenir un sélecteur. Il est associé au type SEL.

Un des moyens de déclencher un appel de méthode à l'aide d'un sélecteur est la méthode performSelector:withObject: de l'objet NSObject.

 Exemple d'utilisation de performSelector:

SEL monSelecteur = @selector(maFonctionAvecUnArgument:);
[unObjet performSelector:monSelecteur withObject:arg1];

// Équivaut à :
[unObjet maFonctionAvecUnArgument:arg1];

Il est également possible, à l'aide de la méthode respondsToSelector:, de savoir si un objet sait répondre à un sélecteur.

 Exemple d'utilisation de respondsToSelector:

SEL monSelecteur = @selector(maFonctionAvecUnArgument:);
if ([unObjet respondsToSelector:monSelecteur]) {
[unObjet performSelector:monSelecteur withObject:arg1];
}

On rencontre également la notion de sélecteur lorsqu'il s'agit d'associer une méthode à un élément déclencheur dans le code, par exemple un bouton.

 Exemple d'utilisation de addTarget:

[self.unBouton addTarget:self
action:@selector(uneAction)
forControlEvents:UIControlEventTouchUpInside];


Synchronisation de threads

Dans une application multithread, il est important de pouvoir empêcher que certaines parties de code soient exécutées simultanément par plusieurs threads.

Objective-C met à la disposition du développeur le mot-clé @synchronize qui prend en paramètre un objet et est suivi par un bloc de code.

Tant que le bloc de code n'a pas fini de s'exécuter, aucun autre thread ne pourra exécuter le même bloc (l'exécution des autres threads est suspendue à la première ligne jusqu'à ce que le premier thread ait terminé le traitement).

 Exemple d'utilisation de @synchronized

@synchronized(self)
{
// Ce code est protégé contre les exécutions en parallèle
}