[object valueForKey: @"key"] retourne une valeur bizarre

FloFlo Membre
10:32 modifié dans API AppKit #1
Bonjour,

j'aurais une petite question (de débutant pour changer  8--)) :

J'ai un objet avec une variable d'instance de type (NSString *).
Quand je fais :
<br /> NSLog(@&quot;%@&quot;, [monObject valueForKey: @&quot;maString&quot;]); <br />


le log m'affiche une adresse au lieu de la NSString désirée, pourquoi ?

Il y aurait-il une conversion de la part de la méthode valueForKey: ? et si oui comment récupérer la chaà®ne correctement sans passer par un getter ?

Merci d'avance pour vos réponses.



Réponses

  • ChachaChacha Membre
    10:32 modifié #2
    dans 1226689080:

    Bonjour,

    j'aurais une petite question (de débutant pour changer  8--)) :

    J'ai un objet avec une variable d'instance de type (NSString *).
    Quand je fais :
    <br /> NSLog(@&quot;%@&quot;, [monObject valueForKey: @&quot;maString&quot;]); <br />
    


    le log m'affiche une adresse au lieu de la NSString désirée, pourquoi ?

    Il y aurait-il une conversion de la part de la méthode valueForKey: ? et si oui comment récupérer la chaà®ne correctement sans passer par un getter ?


    À vue de nez ça devrait marcher. N'y aurait-il pas une erreur ailleurs ?

    +
    Chacha
  • NoNo Membre
    10:32 modifié #3
    Ouaip, l'objet retourné par valueForKey: semble être tout sauf une NSString.
    Les classes qui ne redéfinissent pas la méthode description retournent simplement leur nom et leur adresse mémoire.

    teste ça :
    <br />NSLog(@&quot;%@&quot;, [[monObject valueForKey: @&quot;maString&quot;] className]);<br />
    

    Si ça affiche autre chose que NSString, alors y'a un blème.
  • FloFlo Membre
    10:32 modifié #4

    <br /> NSLog(@&quot;%@&quot;, [[monObject valueForKey: @&quot;maString&quot;] className]);<br />
    



    ça me donne NSCFString, est-ce que le fait que l'objet soit initialisé à  partir d'un NSDictionary créé à  partir d'un plist y est pour quelque chose ?
  • ChachaChacha Membre
    10:32 modifié #5
    Et ta "maString", elle est censée contenir quoi comme chaà®ne de caractères ?

    Tu devrais nous mettre plus de code et de résultats de Logs, sinon on agit en aveugle.

    +
    Chacha
  • FloFlo Membre
    novembre 2008 modifié #6
    ok, je vous met exactement ce que je fais :

    En réalité je manipule des noeuds que j'initialisent à  partir d'un plist, dans l'initialisation il ya la ligne  (DESCRIPTION_KEY est une macro-constante pour l'attribut @description de node) :
    <br /> [node setValue: [aDictionary objectForKey: DESCRIPTION_KEY] forKey: DESCRIPTION_KEY];<br />
    


    j'ai une outlineView qui doit récupérer cet attribut pour chaque noeud via une méthode déléguée à  un NSWindowController en faisant un :
    <br /> [node valueForKey: DESCRIPTION_KEY];<br />
    


    et la patatra... mon outlineView représente bien tous les noeuds mais par des chaines vides. Par contre si je remplace le valueForKey par un getter du genre :
    <br /> - (NSString *) description<br />{<br />    return description;<br />}<br /><br />//dans le delegate<br />[node description];<br />
    


    et ben la ça marche...

    Pour l'instant j'ai juste mis des chaines bidons dans le plist pour chaque description de noeud du style TEST0, TEST1 ....

  • ChachaChacha Membre
    novembre 2008 modifié #7
    dans 1226699286:

    ok, je vous met exactement ce que je fais :

    <br /> [node setValue: [aDictionary objectForKey: DESCRIPTION_KEY] forKey:&nbsp;DESCRIPTION_KEY];<br />
    



    As-tu vérifié que ton dictionnaire contient bien ce que tu attends ?
    NSLog(@%@", aDictionary) sera utile.

    Un truc : si tu en as un peu marre de jouer avec les NSLog, ça vaut le coup d'essayer d'utiliser le debugger. Truc basique : tu mets un point d'arrêt (clic dans la marge), et quand le debugger te permet d'inspecter tes variables, tu peux faire "print description to console".

    +
    Chacha
  • FloFlo Membre
    10:32 modifié #8
    <br /> Un truc : si tu en as un peu marre de jouer avec les NSLog, ça vaut le coup d&#39;essayer d&#39;utiliser le debugger<br />
    


    C'est vrai que je ne l'utilise pas asser souvent celui-la, même si je sais m'en servir...

    J'ai avancé dans le problème, j'ai en fait eu l'extrême mauvaise idée (comme le montre les bout de code que j'ai écrit) de choisir le nom de variable description pour le nom du noeud. Hors il se trouve qu'il s'agit d'une clé réservée quand on fait
    <br /> [unObject valueForKey: @&quot;description&quot;];<br />
    


    du coup normal que la méthode classeName: renvoyait NSCFString et que les log étaient incohérents.

    mais maintenant quand je fais
    <br /> [node valueForKey: @&quot;name&quot;];<br />
    


    ça me met null... certainement un probleme de retain quelque part...
    En tous cas ça me rassure je commençais à  ne plus rien comprendre avec cette histoire de @description.
  • FloFlo Membre
    10:32 modifié #9
    C'est bon, j'avais oublié de changer les clés correspondantes dans le plist   :o

    En tous cas merci de votre aide à  tous les deux.
Connectez-vous ou Inscrivez-vous pour répondre.