comment changer le pointeur interne sur un objet d'un NS...Array/CFArray(résolu)

GenoseGenose Membre
novembre 2005 modifié dans API AppKit #1
bonsoir,

quelqu'un sait 'il comment changer le pointeur interne d'un element CF/NS...Array sans que cette methode ne fasse de release sur l'objet qu'il stockait à  l'origine ?

j'ai chercher à  faire un :

id obj = [tableau objectAtIndex:2];

*obj = [NSObject initialize];  ou *[tableau objectAtIndex:2] = [NSObject initialize];


mais le compliateur m'envoye un message d'erreur.(invalide lvalue)

avez-vous un idée, merci.

Réponses

  • AliGatorAliGator Membre, Modérateur
    novembre 2005 modifié #2
    C'est pas très courant comme pratique ;)
    Moi je ferais ça de la façon la plus propre que propose à  mon avis Cocoa : faire un retain sur l'objet qui se trouve à  l'index 2, puis remplacer l'objet à  l'index 2 par celui que tu veux.
    Mais pour ça faut créer une mutableCopy pour modifier de toute façon ton tableau ;)

    <br />id obj = [tableau objectAtIndex:2]; // l&#39;objet actuel<br />id newObj = [[NSObject alloc] init]; // l&#39;objet qui servira de remplacement.<br /><br />[obj retain]; // on garde obj en mémoire, puisque c&#39;est ce que tu veux<br /><br />// remplacement de l&#39;élément 2, en passant par un MutableArray<br />NSMutableArray* mutab = [tableau mutableCopy];<br />[mutab replaceObjectAtIndex:2 withObject:newObj]; // hop, on a remplacé<br />[tableau release]; // on relâche tableau d&#39;origine<br />tableau = [NSArray arrayWithArray:mutab]; // pour le reremplir avec la mutableCopy modifiée<br />[mutab release]; // plus besoin de la mutableCopy<br />[newObj release]; // on l&#39;a alloc/init donc on a en charge de le releaser. Mais il est toujours existant car il est &#39;retained&#39; dans tableau, pas de soucis.<br />
    
    Voilà  avec ça j'ai passé ton tableau dans un MutableArray le temps de faire le remplacement (remplacement qui se fait très bien en Cocoa), et une fois le remplacement fait, je remet la copie modifiée à  la place de ton tableau original...

    Mais avoue que ça serait 10x plus simple de travailler directement avec un NSMutableArray, tu aurais alors juste à  faire un "replaceObjectAtIndex:withObject:" et c'est tout !

    NB : Ne pas oublier du coup que là , comme tu l'as demandé, j'ai évité que l'objet remplacé qui était à  l'index 2 (obj) ne soit supprimé de la mémoire : de par son remplacement avec replaceObjectAtIndex, il lui a été envoyé un "release", mais comme j'avais fait un retain avant, son retainCount est toujours à  1.
    Conclusion : ne pas oublier que tu es en charge, une fois que tu as fait mumuse avec lui, de le releaser ! (ou alors tu ne fais pas le [obj retain]; mais bon tu as demandé à  garder obj en mémoire...)
  • novembre 2005 modifié #3
    Juste pour rappel: initialize est une fonction qui renvoie void, et appelée à  l'initialialisation de l'objet classe autrement dit ce que vous mettez là  ne pourra jamais aller...

    Sinon pour la réponse à  la question, la solution existe et s'appelle NSMutableArray.
  • AliGatorAliGator Membre, Modérateur
    novembre 2005 modifié #4
    dans 1131965548:

    Juste pour rappel: initialize est une fonction qui renvoie void, et appelée à  l'initialialisation de l'objet classe autrement dit ce que vous mettez là  ne pourra jamais aller...

    Sinon pour la réponse à  la question, la solution existe et s'appelle NSMutableArray.
    Oui merci pour le initialize j'ai pas réfléchi en fait j'ai juste recopié les lignes de code de Génose pour ça sans réfléchir.
    Je viens d'éditer mon message pour le corriger par un alloc/init + un release.

    Mais comme tu le dis (et comme je le dis à  la fin de mon post), NSMutableArray est là  pour ça et c'est quand même 10x plus simple ;)
  • GenoseGenose Membre
    novembre 2005 modifié #5
    bonsoir,

    j'utilisait déjà  un MutableArray mais je ne l'avais pas préciser,

    merci pour le corriger, on avance et t'en mieux ! ;)

    par contre je pensait que le retain dans le coder ne fonctionnait pas, mais aprés relecture de mon code le probleme vener de l'objet pointé où release entrainait le release du pointeur NSArray qui lui-même envoyait Release à  l'objet pointé  :P

    là  ça fonctionne impecable.

    :)
  • AliGatorAliGator Membre, Modérateur
    novembre 2005 modifié #6
    J'suis désolé, j'ai essayé avec Google, avec le traducteur de Dashboard...
    Mais aucun n'a réussi à  faire une traduction.

    J'ai un expert qui parle le Génose couramment ici ?
  • fouffouf Membre
    13:49 modifié #7
    bonsoir,

    j'utilise un MutableArray mais je ne l'avais pas précisé,

    merci pour le corriger, on avance et tant mieux ! Wink

    par contre je pensais que le retain ne fonctionnait pas, mais après relecture de mon code, le problème venait de l'objet pointé où release entrainait le release du pointeur NSArray qui lui-meme envoyait Release à  l'objet pointé  Tongue

    là  ça fonctionne impeccable.


    En gros, y avait une merde mémoire dans le code ;)
Connectez-vous ou Inscrivez-vous pour répondre.