Invocation d'une méthode de classe

07:35 modifié dans API AppKit #1
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

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:@&quot;longValue&quot; 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 ?

Réponses

  • MalaMala Membre, Modérateur
    07:35 modifié #2
    dans 1236792308:

    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

    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:@&quot;longValue&quot; 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 ?



    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.

  • CéroceCéroce Membre, Modérateur
    07:35 modifié #3
    J'ai l'impression qu'il nous manque beaucoup de billes pour pouvoir t'aider.

    i := aNumber.LongValue;
    


    J'ai fini par comprendre que LongValue était une méthode.
    Et aNumber, certainement un NSNumber.

    [player method:@&quot;longValue&quot; forInstance:aNumber];
    


    Et là , qu'est ce que player ?

    Pourquoi ne peux-tu pas écrire
    i = [aNumber longValue];
    


    C'est peut-être naà¯f de ma part, mais si tu peux appeler la méthode -[method:forInstance], pourquoi pas l'autre ?
  • MalaMala Membre, Modérateur
    07:35 modifié #4
    XDev travaille sur un RAD en Pascal. Il s'interface avec Cocoa d'où sa question.
  • 07:35 modifié #5
    @Mala
    Tu as raison. Le runtime est plus souple que je ne le pensais.
    En effet sur un test, la fonction du runtime suivante ...

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


    accepte sans broncher des receveurs d'instance ou de classe.
    Le test est l'instruction suivante:

    id res = objc_msgSend([NSNumberclass],@selector(numberWithLong:),anInt,nil);
    


    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...
Connectez-vous ou Inscrivez-vous pour répondre.