Invocation d'une méthode de classe
Bonsoir,
Le projet XDev avance et je travaille sur l'optimisation des appels des méthodes écrites en Objective-C.
Ainsi, l'instruction en Pascal
se traduit par un appel à la méthode objective-C suivante:
Ensuite chaque paramètre est empilé à l'aide de setArgument de NSInvocation avant son exécution.
Par ce procédé, la mécanique fonctionne rapidement.
Malheureusement, il n'est pas applicable pour les méthodes de classe.
Quelqu'un a une idée ?
Le projet XDev avance et je travaille sur l'optimisation des appels des méthodes écrites en Objective-C.
Ainsi, l'instruction en Pascal
i := aNumber.LongValue;
se traduit par un appel à la méthode objective-C suivante:
-(void)method:(NSString*)inMethod forInstance:(NSObject*)inInstance<br />{<br /> SEL selector = NSSelectorFromString(inMethod);<br /> Class class = [inInstance class];<br /> <br /> if (_invocation)<br /> [_invocation release];<br /> _invocation = [[NSInvocation invocationWithMethodSignature:[class instanceMethodSignatureForSelector:selector]] retain];<br /> [_invocation setSelector:selector];<br /> [_invocation setTarget:inInstance];<br /> _lastArg = 2;<br />} /* method */<br />
Ensuite chaque paramètre est empilé à l'aide de setArgument de NSInvocation avant son exécution.
[player method:@"longValue" forInstance:aNumber];
Par ce procédé, la mécanique fonctionne rapidement.
Malheureusement, il n'est pas applicable pour les méthodes de classe.
Quelqu'un a une idée ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je passerais directement par les fonctions du runtime a ta place (voir class_getClassMethod/class_getInstanceMethod).
Avec NSInvocation ça va être un vrai boulet niveau perfs de toute façon.
J'ai fini par comprendre que LongValue était une méthode.
Et aNumber, certainement un NSNumber.
Et là , qu'est ce que player ?
Pourquoi ne peux-tu pas écrire
C'est peut-être naà¯f de ma part, mais si tu peux appeler la méthode -[method:forInstance], pourquoi pas l'autre ?
Tu as raison. Le runtime est plus souple que je ne le pensais.
En effet sur un test, la fonction du runtime suivante ...
accepte sans broncher des receveurs d'instance ou de classe.
Le test est l'instruction suivante:
Je récupère bien une instance de la classe NSNumber par l'invocation de la méthode de classe numberWithLong. Je lui passe anInt de type long et on termine par nil puisqu'il s'agit d'une fonction avec
liste de paramètres variables.
Merci pour l'idée.
@Céroce
Je travaille depuis quelques temps sur un outils RAD sur la base d'un Pascal Objet maison.
Je suis en train d'intégrer les classes de Cocoa dans le système. Par la même, j'évite le plus souvent
d'écrire la moindre ligne de code pour la translation. La raison est simple; je veux minimiser les erreurs
de saisie et économiser mes nerfs !
Le player est l'objet permettant l'exécution du code compilé/lié.
Je ne manquerai pas de vous (les membres du sites) présenter l'application dès quelle sera présentable !
Une copie d'écran en attendant...