0

Je souhaite intercepter les messages envoyés à un objet proxy en imprimant simplement le sélecteur et les arguments. Même si le proxy ne les implémente pas et n'a pas d'objet cible. S'il vous plaît aider. J'ai regardé plusieurs options et docs Apple, mais ils supposent que vous connaissez déjà l'objet cible. Je veux le faire proprement sans problèmes de mémoire.Impression des arguments envoyés à forwardInvocation: sous-classe de NSProxy

@implementation MyProxy 

    -(void)forwardInvocation:(NSInvocation*)anInvocation 
     { 

     // at this point I would 

     //like to fetch the arguments and put on an array 
     NSMutableArray *myArgs = .....; 
     NSLog(@"Invoking selector %@", theSelector); 
     NSLog (myArgs); // this should print me the list of arguments to the method 
     } 
@end 
     // e.g 
      MyProxy *proxy = [[MyProxy alloc] init]; 
      [proxy SendMeAnyThing: @"hello"]; // this should print me arguments 
     or [proxy add: 12 to: 89 sub: 89]; // should print the arguments 

merci merci

Répondre

3

Les arguments sont à peu près tous les types de C, y compris les types Objective-C, qui peuvent être transmis à la méthode. Ainsi, ils ne peuvent pas être représentés dans un tableau.

Notez que l'appel d'une méthode qui n'est déclarée nulle part n'a aucun sens. Plus précisément, le compilateur n'a aucune idée de la façon de coder les arguments sur le site d'appel pour effectuer un appel de fonction C valide (un appel de méthode est en réalité simplement un appel de fonction C vers objc_msgSend() ou une variante). Donc, pour répondre à votre "toute méthode, même si elle n'existe pas" question; Non, vous ne pouvez pas faire ça.

Vous pouvez cependant éliminer efficacement tous les avertissements du compilateur. Si vous éliminez tous les avertissements du compilateur - tous les avertissements de type "method foo: bar: has not find" - cela signifie que le compilateur a suffisamment d'informations et que vous pouvez faire ce que vous voulez avec un proxy.

En outre (comme je lis plus dans votre question), il n'y a pas besoin d'implémenter une méthode sur le proxy. Un proxy peut tout à fait heureusement transférer vers n'importe quel appel de méthode. Écrit correctement, vous pouvez avoir une procuration pour tout objet sans problème. Ce que vous devez faire est d'énumérer les arguments en utilisant l'API de NSInvocation, en examinant les types puis en décodant chaque argument en conséquence et en imprimant de manière appropriée.

Vous pouvez saisir le nombre d'arguments en appelant numberOfArguments sur la signature de méthode de l'instance NSInvocation (la signature peut être obtenue via la méthode methodSignature).

Puis, parcourez les arguments et appelez getArgumentTypeAtIndex: sur la signature de méthode pour obtenir le type. Vous devrez ensuite écrire une instruction switch() sur l'encodage de type pour ensuite appeler getArgument:atIndex: et décoder de manière appropriée en fonction du type.

Notez que l'argument 0 est self et l'argument 1 est _cmd; le SEL de la méthode invoquée.

Questions connexes