NSLog incomplet
Rocou
Membre
Bonjour,
Soit le bout de code suivant:
Tout fonctionne sauf que la fin de la chaà®ne "pour client" n'apparaà®t pas.
Soit le bout de code suivant:
for(NSDictionary * fiche in result)<br /> { <br /> NSLog(@"Cette fiche a %@ pour client." , [fiche valueForKey: @"client"]);<br /> }<br />
Tout fonctionne sauf que la fin de la chaà®ne "pour client" n'apparaà®t pas.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est que [fiche valueForKey: @client] vaut nil, ou que la variable d'instance "client" ne répond pas à la méthode "description".
Je sais que [fiche valueForKey: @client] ne vaut pas nil puisque les données s'affichent.
Mais qu'est-ce que la "méthode description"?
Non, j'en doute... %@ est capable d'afficher "nil", et si "client" ne répondait pas à "description", ça enverrait une exception et rien ne s'afficherait...
Elle peut être redéfinie dans tout objet héritant de NSObject.
description : NSObject
Returns a string that describes the contents of the receiver.
- (NSString *)description
Alors là c'est effectivement un mystère.
Pour qu'un fprintf() s'arrête en cours de format, je ne vois que la présence d'un '\0' dans le format.
Essaye d'autres arguments ...
Effectivement
#import <Foundation/Foundation.h>
int main(int argc, char**argv){
NSAutoreleasePool * pool =[[NSAutoreleasePool alloc]init];
NSLog(@Coucou %@ pour client ",nil);
[pool drain];
return 0;
}
répond
% gcc pgm.m -o pgm -framework Foundation
% pgm
2008-07-25 14:48:54.654 pgm[871:10b] Coucou (null) pour client
alors que
#import <Foundation/Foundation.h>
int main(int argc, char**argv){
NSAutoreleasePool * pool =[[NSAutoreleasePool alloc]init];
NSLog(nil);
[pool drain];
return 0;
}
n'écrit rien du tout
Quand j'essaie d'afficher autre chose (un entier par exemple), ça fonctionne.
Veux-tu dire que dans ma variable "client" j'ai probablement un '\0'? Mais comment en être sur et comment le supprimer?
Elle hérite de NSString * ?
Pour voici le bout de code complet que j'ai un peu remanié afin de le rendre plus clair (pour moi) mais cela ne change rien:
NSString *query = @select clients.nom as client from clients;
NSMutableArray *result = nil;
PGSQLRecordset *rs = [connection open:query];
if (rs != nil) {
if (![rs isEOF])
{
if (result != nil)
{
[result release];
result = nil;
}
result = [[NSMutableArray alloc] init];
int i=0;
while (![rs isEOF])
{
[result addObject:[rs dictionaryFromRecord]];
NSString* valeur = [[result objectAtIndex:i] valueForKey:@client];
NSMutableDictionary * maligne=[NSMutableDictionary dictionaryWithObjectsAndKeys:valeur,@first,nil];
model=[[NSArray alloc] initWithObjects:maligne,nil];
tableView:objectValueForTableColumn:row:
NSLog(@Cette fiche a %@ pour client.", valeur);
i++;
[rs moveNext];
}
}
#import <Foundation/Foundation.h>
int main(int argc, char**argv){
NSAutoreleasePool * pool =[[NSAutoreleasePool alloc]init];
NSLog(@Coucou %@ pour client ",@ma\0chin");
[pool drain];
return 0;
}
% gcc pgm.m -o pgm -framework Foundation
% pgm
2008-07-25 17:35:23.153 pgm[1459:10b] Coucou ma
%
2) Fait un code plus simple.
Pour voir la classe de valeur,
id valeur = [[result objectAtIndex:i] valueForKey:@client];
et
NSLog(@classe :%@",[value class]);
NSLog(@hérite de : %@",[value superclass]);
et/ou simplement fouiller dans le framework que tu as dû inclure
Voici ce que cela a donné:
classe :NSCFString
hérite de : NSMutableString
c'est curieux. une "string" hérite d'une "NSMutableString".
D'habitude, c'est le contraire.
NSCFString est une classe privée utilisée pour rendre compatible les "...String" définies selon les API
faire une recherche sur toll-free bridge
La ligne en question est effectivement mauvaise mais elle n'est pas responsable du problème sur le NSLog (j'essaie de résoudre deux problèmes bien distincts)