2009-09-03 7 views
42

Exemple: J'ai une méthode -myFooBarMethod:withFoo:bar:moreFoo: et à l'intérieur de l'implémentation de cette méthode je veux obtenir dynamiquement le nom de celui-ci, comme @"-myFooBarMethod:withFoo:bar:moreFoo: dans un NSString. Pas de typage dur de la signature de la méthode. Je pense que cela doit faire quelque chose avec des sélecteurs. Comment puis-je obtenir le nom de la méthode actuelle (celle qui exécute le code) en tant que NSString?Comment obtenir le nom ou la signature de la méthode actuelle dans un NSString?

Répondre

94

Chaque appel de méthode passe également deux arguments cachés: un id nommé self et un SEL nommé _cmd. Vous pouvez utiliser NSStringFromSelector pour convertir le sélecteur de méthode pour un NSString:

NSStringFromSelector(_cmd); 
+12

Vous pouvez également utiliser la macro ** '__PRETTY_FUNCTION__' **, que le préprocesseur remplace par une chaîne C (char *) du nom de la méthode. Cela fonctionne également pour les fonctions C. –

+1

Je n'étais pas au courant qu'il y avait une macro appelée '__PRETTY_FUNCTION__'. J'aime ça. Maintenant, je dois juste trouver une raison de l'utiliser dans mon code quelque part ... – GeneralMike

1

Selon la réponse de Martin, mais vous pouvez également lire les informations Objective C 2.0 Runtime. Jouer dans les tripes comme ça a tendance à conduire à un code difficile à gérer, par contre.

+1

Il y a des fois c'est valide, cependant. – Abizern

+0

Les exemples de développeur d'Apple l'utilisent pour la journalisation comme suit: 'NSLog (@"% @ received% @ ", self, NSStringFromSelector (_cmd));' –

7

À titre d'exemple, où ce genre de chose est utile: Ceci est un modèle pour les messages NSLog que j'utilise:

NSLog(@"%@ %@: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), @"A Message"); 

Cette dumps la classe et la méthode de la console lors de la connexion.

16

Utilisez __func__. C'est une chaîne C, donc pour un NSString, utilisez [NSString stringWithUTF8String:__func__].

Cela a deux avantages par rapport _cmd:

  1. Il travaille dans les fonctions C et méthodes C++ ainsi que les méthodes Objective-C. (En fait, __func__ doit exister en C99.)
  2. Dans les méthodes Objective-C, elle inclut le type de méthode (méthode de classe par rapport à la méthode d'instance) et le nom de classe ainsi que le sélecteur. Par exemple, "-[MyView drawRect:]".
Questions connexes