41 votes

Invoquer dynamiquement une méthode de classe dans Objective C

Supposons que j’ai l’interface Objective C SomeClass qui possède une méthode de classe appelée someMethod :

 @interface SomeClass : NSObject {
}

+ (id)someMethod;
@end
 

Dans une autre interface, je veux une méthode d'assistance qui appelle dynamiquement someMethod sur une classe comme celle-ci:

 [someOtherObject invokeSelector:@selector(someMethod) forClass:[SomeClass class];
 

Quelle devrait être la mise en œuvre pour invokeSelector ? Est-ce possible?

 - (void)invokeSelector:(SEL)aSelector forClass:(Class)aClass {
   // ???
}
 

83voto

stefanB Points 27796

Au lieu de:

 [someOtherObject invokeSelector:@selector(someMethod) forClass:[SomeClass class];
 

appel:

 [[SomeClass class] performSelector:@selector(someMethod)];
 

Exemple (en utilisant GNUstep ...)

déposer Ah

 #import <Foundation/Foundation.h>
@interface A : NSObject {}

-(NSString* ) description;
+(NSString*)action;
@end
 

fichier Am

 #import <Foundation/Foundation.h>
#import "A.h"

@implementation A

- (NSString *) description
{
    return [NSString stringWithString: @"A"];
}

+(NSString*)action
{
    return [NSString stringWithString:@"A::action"];
}

@end
 

Ailleurs:

 A * a = [[A class] performSelector:@selector(action)];
NSLog(@"%@",a);
 

Sortie:

 2009-11-22 23:32:41.974 abc[3200] A::action
 

4voto

Adrian Points 646

En Objective-C, les classes sont des objets aussi bien. Les objets de classe sont traités différemment, cependant, qu'ils peuvent appeler les méthodes d'instance de leur classe racine (NSObject ou NSProxy de Cacao).

Il est donc possible d'utiliser toutes les méthodes d'instance définie en NSObject sur les objets de la classe ainsi que la bonne façon de les invoquer dynamiquement une méthode de la classe est:

[aClass performSelector:@selector(aSelector)];

L' apple docs sont un peu plus spécifiques.

2voto

Benoit Points 39210

Vous ne devriez pas implémenter ceci vous-même.

Le protocole NSObject a une méthode performSelector: qui fait exactement cela.

2voto

vanja. Points 1137

Est-ce que cette méthode intégrée est ce que vous voulez?

 id objc_msgSend(id theReceiver, SEL theSelector, ...)
 

(Voir la documentation de référence d'exécution pour cette fonction .)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X