Ajouter une entrée dans un dictionnaire et copie d'objet

AliAli Membre

Bonjour à  toutes et à  tous,


J'essaie d'ajouter des entrées dans mon dictionnaire avec "setObject :forKey" mais j'ai remarqué un truc bizarre (pour moi) car c'est la première fois ou je le vois.

En effet le quand je passe un object en tant que "key", il le copie avant de le setter.

Autrement dit, si j'ai un object A (0x..a) et je fait [dico setObject:@test forKey:A], j'ai un dictionnaire avec la clé A (0x...7) mais qui n'a pas la même référence que mon object d'origine.


Est ce qu'il y a un moyen de ne pas faire une copie mais mettre l'object lui même en tant que clé pour le dictionnaire.?


 


Bonne journée.


Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur

    Les clés d'un dictionnaire sont des objets conformes au protocole NSCopying.


    Si tu veux un autre fonctionnement, jette un oe“il à  NSMapTable.


  • Joanna CarterJoanna Carter Membre, Modérateur
    C'est pas conseillé d'éviter les mechanisms comme ça. Qu'est-ce qui se passerait si un des clés était muté pendant la vie du dictionnaire ?
  • AliAli Membre


    Les clés d'un dictionnaire sont des objets conformes au protocole NSCopying.


    Si tu veux un autre fonctionnement, jette un oe“il à  NSMapTable.





    Merci Céroce pour ta réponse, j'ai pu réglé mon problème avec le NSMapTable.

  • Pour info, comme déjà  dit sur ce forum, NSCache fonctionne comme NSDico mais ne copie pas le clés.


  • CéroceCéroce Membre, Modérateur


    C'est pas conseillé d'éviter les mechanisms comme ça. Qu'est-ce qui se passerait si un des clés était muté pendant la vie du dictionnaire ?




    Le fait que l'objet ait changé n'est pas forcément un problème.


    Par exemple, j'utilise ce mécanisme pour associer deux objets dans mon appli, l'objet en question (la clé) et l'objet qui en est responsable.


     


    Je t'accorde qu'il faut bien savoir ce qu'on fait en matière de gestion mémoire, et que c'est une approche risquée par principe.

  • Joanna CarterJoanna Carter Membre, Modérateur
    On peut anticiper les problèmes si l'on change la valeur d'une propriété qui est utilisé comme hash pour l'implementation de isEqual.
Connectez-vous ou Inscrivez-vous pour répondre.