33 votes

Impression d'une NSString

Quelle est la bonne façon d'imprimer un NSString en Objective-C ? Beaucoup d'exemples utilisent NSLog(), mais d'après la documentation :

NSLog est une fonction FoundationKit qui permet d'imprimer des instructions de débogage sur la console. ... NSLog fonctionne essentiellement comme : fprintf(stderr, format_string, args ...) ;

Ce qui, pour moi, ressemble un peu à la macro _TRACE dans Win32/C++. Je ne veux pas imprimer sur stderr, je veux imprimer sur stdout. Certaines personnes suggèrent d'utiliser printf() comme suit :

printf("%s", [str cStringUsingEncoding:NSUTF8StringEncoding]);

Mais cela semble être un niveau supplémentaire d'indirection pour obtenir l'impression de NSString, et cela ne semble pas être la solution.

29voto

bbum Points 124887

La diffusion d'informations à l'intention des stdout est en fait une chose assez rare à faire en Cocoa, étant donné que presque tous les projets sont de nature GUI. Il y a relativement peu de projets qui sont construits en tant qu'outils de ligne de commande ou qui ont besoin de traiter avec des stdout .

Cependant, la Fondation fournit les moyens d'écrire sur la sortie standard (stdout). En particulier, NSFileHandle a fileHandleWithStandardOutput qui vous donne un handle de fichier qui peut écrire dans stdout .

À partir de là, il s'agit de convertir les NSString à un NSData et l'écrire.

Il s'agit de quelques étapes, mais elles sont facilement intégrées dans une fonction réutilisable :

void MyLog(NSString *format, ...) {
    va_list args;
    va_start(args, format);
    NSString *formattedString = [[NSString alloc] initWithFormat: format
                                                  arguments: args];
    va_end(args);
    [[NSFileHandle fileHandleWithStandardOutput]
        writeData: [formattedString dataUsingEncoding: NSNEXTSTEPStringEncoding]];
    [formattedString release];
}

26voto

KennyTM Points 232647

Eh bien, ceci est la solution.

Depuis printf est une fonction purement C, elle ne reconnaîtra pas les objets Objective-C. (Le formateur de NSLog est différent de celui de printf.) Par conséquent, vous devez le convertir en une chaîne de caractères C avant de le formater.

BTW vous pouvez utiliser [str UTF8String] au lieu de [str cStringUsingEncoding:NSUTF8StringEncoding] .

8voto

AidenX Points 159

C string (UTF8String) est un pointeur sur une structure à l'intérieur de l'objet string.

NSString *str = @"Hello, World.";
printf("%s\n", [str UTF8String]);

4voto

svth Points 694

Je pense que vous les trouverez adaptés à vos besoins :

// print to stdout
static void NSPrint(NSString *format, ...) {
    va_list args;
    va_start(args, format);

    NSString *string = [[NSString alloc] initWithFormat:format arguments:args];

    va_end(args);

    fprintf(stdout, "%s\n", [string UTF8String]);

#if !__has_feature(objc_arc)
    [string release];
#endif
}

// print to stderr
static void NSPrintErr(NSString *format, ...) {
    va_list args;
    va_start(args, format);

    NSString *string = [[NSString alloc] initWithFormat:format arguments:args];

    va_end(args);

    fprintf(stderr, "%s\n", [string UTF8String]);

#if !__has_feature(objc_arc)
    [string release];
#endif
}

3voto

Eimantas Points 29052

Vous devez utiliser le gestionnaire de fichiers personnalisé ou écrire une macro vous-même.

Astuce : lorsque NSLog imprime un objet, il utilise la fonction debugDescription méthode. Vous pouvez surcharger cette méthode pour vos propres NSObject pour imprimer des informations de débogage personnalisées sur stdout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X