Warning et mutable pas si mutable que ça, 2 questions indépendantes

chaps31chaps31 Membre
23:42 modifié dans API AppKit #1
Salut à  tous, j'ai 2 questions pour ce soir...

1) J'ai un warning sur une méthode car il existe une autre méthode portant le même nom, ça n'empêche pas de fonctionner car les 2 méthodes ne font pas partie de la même classe, mais d'une classe Apple et d'un framework dont je me sert mais que je n'ai pas codé(méthode "close")... Je ne peux donc rien y faire, mais est-ce grave docteur ? Merci.

2) J'ai un
-[NSCFDictionary setObject:forKey:]: mutating method sent to immutable object
qui arrête une méthode (sans planter l'appli) mais... L'objet concerné est un NSMutableDictionary... Incompréhensible, je ne vous donne pas bcoup d'indices mais j'espère que vous reconnaitrez une erreur classique...

Merci
«1

Réponses

  • ClicCoolClicCool Membre
    23:42 modifié #2
    C'est parfois mal commode d'avoir des méthodes de même nom dans des classes distinctes.
    Mais c'est pâs bien grave et assez fréquent (genre pour les méthodes name, length etc...)
    Je comprend que ça te gêne ces warnings qui risque d'en masquer d'autres plus graves.
    Désactives donc l'option de warning correspondant aux méthodes identiques dans les options de build de ton compilateur.

    dans 1256054868:

    2) J'ai un
    -[NSCFDictionary setObject:forKey:]: mutating method sent to immutable object
    
    qui arrête une méthode (sans planter l'appli) mais... L'objet concerné est un NSMutableDictionary... Incompréhensible, je ne vous donne pas bcoup d'indices mais j'espère que vous reconnaitrez une erreur classique...

    Merci


    Si le log te dis qu'il est pas mutable, c'est qu'il est pas mutable.
    Il suffit pas de souhaiter qu'il le soit pour que ce soit vrai.
    Si tu écris un truc du genre
    NSMutableDictionary * monDict = [[NSDictionarry alloc] init];
    

    Ben monDict n'est pas mutable, même si t'a pris la peine de déclarer ton pointeur comme pointant vers un mutable.
  • schlumschlum Membre
    23:42 modifié #3
    dans 1256054868:

    Salut à  tous, j'ai 2 questions pour ce soir...

    1) J'ai un warning sur une méthode car il existe une autre méthode portant le même nom, ça n'empêche pas de fonctionner car les 2 méthodes ne font pas partie de la même classe, mais d'une classe Apple et d'un framework dont je me sert mais que je n'ai pas codé(méthode "close")... Je ne peux donc rien y faire, mais est-ce grave docteur ? Merci.

    2) J'ai un
    -[NSCFDictionary setObject:forKey:]: mutating method sent to immutable object
    
    qui arrête une méthode (sans planter l'appli) mais... L'objet concerné est un NSMutableDictionary... Incompréhensible, je ne vous donne pas bcoup d'indices mais j'espère que vous reconnaitrez une erreur classique...

    Merci


    Attention aux méthodes portant le même nom (ou plutôt qui ont la même signature de sélecteur), ça peut poser problème pour des objets qui ne sont pas dans la même hiérarchie.

    Ton MutableDictionnary a probablement été initialisé avec une méthode de NSDictionary.
  • chaps31chaps31 Membre
    23:42 modifié #4
    Malheureusement non, bon comme je le craignais ça va être plus complexe de prévu... A moins d'une grande idée je vais continuer à  réfléchir.
  • schlumschlum Membre
    23:42 modifié #5
    Alors dans ce cas c'est un problème mémoire... Tu utilises un mutable qui a déjà  été relâché et écrasé par un immutable.
  • chaps31chaps31 Membre
    23:42 modifié #6
    Idée lumineuse qui n'a pas effleuré mon esprit mais :
    NSMutableDictionary *majdata=[[NSMutableDictionary alloc]init];<br />Code....<br />[majdata release];
    


    Et c'est dans la partie "Code...." que je prend le message de tentative de modif d'un immutable....  :crackboom:-
  • ClicCoolClicCool Membre
    23:42 modifié #7
    dans 1256117494:

    Idée lumineuse qui n'a pas effleuré mon esprit mais :
    NSMutableDictionary *majdata=[[NSMutableDictionary alloc]init];<br />Code....<br />[majdata release];
    


    Et c'est dans la partie "Code...." que je prend le message de tentative de modif d'un immutable....  :crackboom:-


    Mais alors, es-tu bien sur que le message d'erreur concerne bien ton majdata ?
    -[NSCFDictionary setObject:forKey:]: mutating method sent to immutable object
    

    Ne précise pas qu'il s'agit de ton majdata, même si le contexte nous pousse naturellement à  le penser.
    Que fait-elle cette "partie code" ?
    Ne tenterait-elle pas de modifier un autre NSDictionary ? qui par exemple serait un des élements contenu dans ton NSMutableDictionary ?
  • chaps31chaps31 Membre
    octobre 2009 modifié #8
    Malheureusement le majdata est rempli à  partir d'une ligne d'un NSMutableArray...

    EDIT : Et j'ai vérifié, c'est là  que j'ai le message :
    [majdata setValue:nommut forKey:@&quot;nom&quot;];
    


    Il y a toute une série derrière.

    Ce qui est dingue c'est que je n'ai pas touché à  cette partie du code de mon ancien projet, a seule différence : La version de XCode...
    NB : En fait j'ai touché à  une autre classe dont une instance est appelée un peu plus haut mais qui n'intervient pas avec majdata..
  • AliGatorAliGator Membre, Modérateur
    23:42 modifié #9
    Ecrasement mémoire ?
  • chaps31chaps31 Membre
    23:42 modifié #10
    dans 1256120253:

    Ecrasement mémoire ?


    A moins que tu parles d'Alzheimer, sinon je ne vois pas... un écrasement mémoire permanent, à  chaque fois ?
  • schlumschlum Membre
    23:42 modifié #11
    C'est pas compliqué à  voir... Mets un breakpoint sur ce "setValue:forKey", et fait afficher l'objet dans la console ("po majdata")
  • chaps31chaps31 Membre
    23:42 modifié #12
    Comment je fais apparaitre l'objet ? Parce-que sa vaeur pas de pb j'ai fais un NSLog
  • AliGatorAliGator Membre, Modérateur
    23:42 modifié #13
    Bah schlum te l'a dit : "po majdata" dans le débuggueur
  • schlumschlum Membre
    23:42 modifié #14
    Et aussi "po [majdata class]" mais il me semble que c'est donné avec "po" aussi...
  • chaps31chaps31 Membre
    23:42 modifié #15
    Merci, merci et là  AAAHH  B)

    po [majdata class]
    NSCFDictionary

    Mon code
    NSMutableDictionary *majdata=[[NSMutableDictionary alloc]init];
    

    :why?:
  • ClicCoolClicCool Membre
    23:42 modifié #16
    Et juste après son initialisation que te retourne "po [majdata class]" ?

    Si c'est bon alors, si tu suis [majdata class] depuis la ligne d'initialisation jusqu'à  la ligne qui génère l'erreur ça change quand  ?

    T'es en monoThread ?
  • chaps31chaps31 Membre
    23:42 modifié #17
    Monothread

    La variable est toujours en non mutable incroyable !!!
  • ClicCoolClicCool Membre
    23:42 modifié #18
    Bon restons calmes,

    Y'a rien de magique dans l'objC et Cocoa,
    Il doit bien y avoir une explication simple.



    Mais bon, à  ce stade moi je ferais un "Clean all Target"






    Et tant que tu y es, Quites XCode, éteints ton mac,
    Coupes le disjoncteur de chez toi, coupes aussi le jus dans tout le quartier, débranches le cable,
    Puis files vite acheter 10 non 100 bougies et batonets d'encens,
    Allumes tout ça chez toi, mets un pagne, et danses en sautillant autour de ton mac en psalmodiant, en ObjC, des incantations à  Cocoa.

    Après tu te serts une soupe (avec 2 glaçons), tu croises les doigts, relances tout, recompiles et débug....  B)
  • chaps31chaps31 Membre
    23:42 modifié #19
    dans 1256224749:


    Coupes le disjoncteur de chez toi, coupes aussi le jus dans tout le quartier, débranches le cable,
    Puis files vite acheter 10 non 100 bougies et batonets d'encens,
    Allumes tout ça chez toi, mets un pagne, et danses en sautillant autour de ton mac en psalmodiant, en ObjC, des incantations à  Cocoa.

    Après tu te serts une soupe (avec 2 glaçons), tu croises les doigts, relances tout, recompiles et débug....  B)


    Tu penses bien j'ai commencé par ça avant de poster ici...  ;D

    Plus sérieusement je vais finir par copier-coller mon code.
  • ClicCoolClicCool Membre
    23:42 modifié #20
    dans 1256225776:
    .../...
    Tu penses bien j'ai commencé par ça avant de poster ici...  ;D

    Plus sérieusement je vais finir par copier-coller mon code.


    Et ça a pas marché ?
    Doit y avoir quelqu'un qui émet des "ondes négatives" ?
    Essaies un truc du genre [belleMere Release] .... ?  ::)


    Sinon postes ton code en effet.
  • chaps31chaps31 Membre
    23:42 modifié #21
    JE viens de découvrir un truc, dans la méthode j'initialise des NSMutableString, et bien pour eux aussi le debugger me sort :

    NSCFString !!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Je ne sais pas ce que signifie le "CF" mais si c'était mutable il le mettrait.. Pourquoi je n'ai plus de mutable mystère... Seul "explication" mais je ne vois pas par quelle magie cela poserait problème :
    J'ai une autre classe dans mon projet où j'ai une méthode init créée par mes soins, je n'ai modifié des lignes que dans cette classe, mais je ne vois pas pourquoi ça gênerait, je le dis à  tout hasard...
  • ClicCoolClicCool Membre
    23:42 modifié #22
    dans 1256229424:
    .../...Je ne sais pas ce que signifie le "CF"


    Core Fundation

    dans 1256229424:
    mais si c'était mutable il le mettrait..


    Oui il mettrait NSCFMutableString
    Un NSCFString n'est PAS mutable non plus


    Serait-il possible que ton FundationFramework soit corrompu ?  B)
    Je laisse la place aux experts de haut vol sur ce coup  :-\\
  • chaps31chaps31 Membre
    23:42 modifié #23
    Ho je viens d'avoir un joli :

    Program received signal:  “EXC_BAD_ACCESS”.

    .... :crackboom:-

    Puis le run d'après j'en ai plus...
  • schlumschlum Membre
    23:42 modifié #24
    Non, il n'y a pas de NSCFMutableDictionary ou NSCFMutableString...
    Ce sont des ClassClusters en fait, donc "po" ne fonctionnera pas.

    Par contre, le EXC_BAD_ACCESS montre bien qu'il y a un gros mic-mac dans la mémoire.
  • ClicCoolClicCool Membre
    23:42 modifié #25
    Là  y'a carrément une erreur d'accès, genre accès à  un objet déjà  désalloué.

    Peut-être qu'en épiant ton appli avec Zombie, Instrument etc... tu trouverais des pistes ?





    P.S. Tu serais pas en train de tester le futur génial extraordinaire et super-puissant MxCode de chez Microsoft ????
    (un générateur de bug quoi !)
  • chaps31chaps31 Membre
    23:42 modifié #26
    J'ai trouvé la ligne qui pose problème :
    majdata=[clientsSelect objectAtIndex:ligne];
    


    Si je mets cette ligne de code en commentaire, plus de bug immutable/mutable à  la ligne :
    [majdata setValue:nommut forKey:@&quot;nom&quot;];
    

    Vous me direz il n'y a plus de clé "nom" dans mon dico, c'est vrai, mais néanmoins je pense que l'erreur devrait subsister clé ou pas clé avec l'utilisation d'un setValue ur un "sois-disant" immutable

    Mais je n'ai pas modifié cette partie du code et ça fonctionnait avec l'ancienne version de XCode...

    Info :
    NSMutableArray *clientsSelect;
    
    est une variable d'instance.

    clientsselect est rempli avec un initWithArray d'un NSMutableArray...

    Bon belle découverte mais je n'avance pas d'un pouce dans la compréhension du problème...
  • ClicCoolClicCool Membre
    23:42 modifié #27
    dans 1256231204:

    J'ai trouvé la ligne qui pose problème :
    majdata=[clientsSelect objectAtIndex:ligne];
    
    .../...


    Petit cachotier !  >:)

    Tu nous avais pas dit que tu "redéfinissais" majdata.
    Donc ce majdata ne pointe plus du tout vers le résultat de ton alloc-init que tu nous a fait lire !
    Probablement que ton Array clientsSelect, contient lui des NSDictionary NON mutables !!
  • ClicCoolClicCool Membre
    23:42 modifié #28
    Oups, au passage, merci Schlum pour le po dans la "console" du débugger ;)

    Je connaissais pas et j'en ai profitté pour explorer un peu les GDB Commands.

    Sais pas encore trop si et quand ça me servira mais c'est instructif en tous cas :)
  • schlumschlum Membre
    octobre 2009 modifié #29
    Ton code a l'air d'un sac de noe“ud niveau mémoire  :P
    Si tu réassigne "majdata" avec un autre truc derrière, pour un peu que tu fasses un "release" dessus derrière, ça pète facilement oui.

    Tu devrais passer un coup de " clang " dessus.
    http://www.clanggui.eliotis.com/
  • chaps31chaps31 Membre
    23:42 modifié #30
    Merci pour le lien schlum... En effet je relis mon code et l'améliore... Pourquoi ai-je fait un alloc init et plus loin ça... reste de programmation en PHP.

    Le Clientsselect est un array initwitharray d'un autre tableau mutable, qui contient des valeurs de la base, extraites via une méthode d'une autre classe modifiée avec le nouveau framework (on y est) qui a une méthode qui sort tout seul le contenu de la base en dico...

    pfff.. et le dico m'étonnerais pas qu'il soit pas mutable, je verrais demain si c'est ça... On va voir mais encore merci
  • RocouRocou Membre
    23:42 modifié #31
    Je ne sais pas si cela peut t'aider mais pour ma part, j'utilise souvent 'mutableCopy'.

    Par exemple:

    NSMutableDictionary *monDico;<br />PGSQLRecordset *rs;<br />...<br />rs = [connection open:query];<br />...<br />monDico = [[rs dictionaryFromRecord] mutableCopy];<br />...
    


    Je peux ainsi manipuler les données contenues dans 'monDico'
Connectez-vous ou Inscrivez-vous pour répondre.