2010-04-16 2 views
22

Une autre de mes questions sur optimizing Objective C programs a inspiré ce qui suit: quelqu'un a-t-il un court exemple utilisant SEL et IMP quand theMethod a deux (ou plus) entiers pour l'entrée?Objective-C et utilisation de SEL/IMP

+1

Pouvez-vous donner plus de détails? Je ne suis pas sûr de ce que vous voulez dire par SEL et IMP. – drekka

+0

Ouais, qu'est-ce que tu veux faire exactement? –

Répondre

45

Voici un good tutorial pour obtenir l'IMP actuel (avec un aperçu des IMPs). Un exemple très basique des Lutins et est SELs:

- (void)methodWithInt:(int)firstInt andInt:(int)secondInt { NSLog(@"%d", firstInt + secondInt); } 

SEL theSelector = @selector(methodWithInt:andInt:); 
IMP theImplementation = [self methodForSelector:theSelector]; 
//note that if the method doesn't return void, you have to explicitly typecast the IMP, e.g. int(* foo)(id, SEL, int, int) = ... 

Vous pouvez alors invoquer la IMP comme ceci:

theImplementation(self, theSelector, 3, 5); 

Il n'y a généralement aucune raison de besoin PMIs à moins que vous faites voodoo sérieux - est y a-t-il quelque chose de spécifique que vous voulez faire?

+3

@eman: vous devez convertir ce retour ainsi: void (* theImplementation) (id, SEL, int, int) = (void (*) (id, SEL, int, int)) [self methodForSelector: leSelecteur]; –

+0

@Jason Coco-Corrigez-moi si je me trompe, mais je pense que IMP est typedef'd comme (id, SEL, ...), donc ça ne devrait pas avoir d'importance (bien que ce ne soit pas sûr, mais si vous avez besoin de sécurité, vous ne devriez probablement pas utiliser IMPs). – shosti

+3

Vous avez raison, puisque cette méthode est nulle, c'est OK, mais vous obtiendrez des erreurs dans beaucoup d'autres instances. Vous/need/cast était probablement trop fort, vous/devriez toujours lancer/est probablement plus correct;) - mais étant donné cette question elle-même, je suppose que l'OP ne devrait probablement pas/ne pas utiliser IMP non plus. –

1

Maintenant que j'ai ce travail grâce à iman, je peux ajouter encore un autre exemple:

SEL [email protected](getRankOf:::::::);

IMP rankingMethod=[eval methodForSelector:cardSelector];

rankingMethod(eval, cardSelector, 0, 1, 2, 3, 4, 5, 6);

Je ne ai pas besoin de cela pour quelque chose d'utile, J'avais juste besoin de satisfaire ma curiosité! Merci encore.

+0

Un autre bon lien sur l'optimisation d'Objective-C est http://www.mulle-kybernetik.com/artikel/Optimization/opti-3-imp-deluxe.html – SK9

1

Voici une autre alternative possible. Cela évite l'écrasement mais le talonnage ne fonctionne pas.

- (void)setUp 
{ 
    [super setUp]; 

    [self [email protected](firstName) toClass:[User class]]; 
    [self [email protected](lastName) toClass:[User class]]; 
} 

- (void)addSelector:(SEL)selector toClass:(Class)class 
{ 
    NSString *uniqueName = [NSString stringWithFormat:@"%@-%@", NSStringFromClass(class), NSStringFromSelector(selector)]; 
    SEL sel = sel_registerName([uniqueName UTF8String]); 
    IMP theImplementation = [class methodForSelector:sel]; 
    class_addMethod(class, selector, theImplementation, "[email protected]:@"); 
} 
Questions connexes