Les méthodes avec une liste variable d'arguments

Philippe49Philippe49 Membre
mai 2009 modifié dans API AppKit #1
Un exemple suite à  la lecture de l'article de  Matt Gallagher. Toutes les ressources sont dans la bibliothèque C <stdarg.h>, mis à  part la macro NS_REQUIRES_NIL_TERMINATION. On peut lire la page man associée (Help > Open Man page)

Le code qui suit crée une chaà®ne de caractères en concaténant les objets passés en arguments. Si ce ne sont pas des chaà®nes de caractères, on prend leur description.

#import &lt;Foundation/Foundation.h&gt;<br /><br />@interface NSString (Concatenation) <br />+ (NSString*) stringByConcatenatingStrings:(NSString *) fisrtString, ... NS_REQUIRES_NIL_TERMINATION ;<br />@end<br /><br />@implementation NSString (Concatenation) <br />+ (NSString*) stringByConcatenatingStrings:(NSString *) firstString, ... {<br />	NSMutableString * result=[NSMutableString string];<br />	va_list args;<br />	va_start(args,firstString);<br />	NSString * arg=firstString;<br />	do {<br />		if([arg isKindOfClass:[NSString class]]) {<br />			[result appendString:arg];<br />		} else {<br />			[result appendString:[arg description]];<br />		}<br />		arg=va_arg(args,NSString *);<br />	} while(arg!=nil);<br />	va_end(args);<br />	return [[result copy] autorelease];<br />}<br />@end<br /><br />int main (int argc, const char * argv&#91;]) {<br />	NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];<br />	<br />	NSString * str=[NSString stringWithFormat:@&quot;World %d&quot;,2009];<br />	NSDate * date=[NSDate date];<br />	NSString * concat=[NSString stringByConcatenatingStrings:@&quot;Hello &quot;,date,str,nil];<br />	NSLog(concat);<br />	<br />	[pool drain];<br />	return 0;<br />}

Réponses

  • AliGatorAliGator Membre, Modérateur
    04:05 modifié #2
    Pas de "va_end" ? (Je suis pas sûr qu'il serve réellement à  qqch, mais c'est tjs mieux non ?)
  • schlumschlum Membre
    04:05 modifié #3
    S'il y a des choses allouées par va_start, il sert forcément...
  • Philippe49Philippe49 Membre
    04:05 modifié #4
    Certes .. je le rajoute


    The va_end() macro handles a normal return from the function whose variable argument list was initialized by va_start().

Connectez-vous ou Inscrivez-vous pour répondre.