2009-08-11 2 views
0

J'implémente une classe qui doit stocker des objets arbitraires avec une chaîne. à savoirComment stocker des paires objet/chaîne sans conserver les objets, et quel type de stockage utiliser?

myUIViewObject, @"that's a nice view" 
myUIViewController, @"not really special" 
myOtherObject, @"very important one" 

cette liste peut être étendue et modifiée à tout moment, donc je pensais à l'aide NSMutableDictionary ici. Mais je ne suis pas vraiment sûr ...

L'objet doit être la clé, à savoir que je veux trouver facilement la chaîne correspondante pour myUIViewController ou myOtherObject quand je demande comme si:

- (NSString*)checkObjNoteStringForObject:(id)anyObjectInList; 

L'autre Le problème est que lorsqu'un objet est ajouté à cette "liste", je ne veux pas qu'il soit retenu à cause de cela. NSMutableDictionary conserve son contenu, n'est-ce pas? Pourrais-je simplement envoyer une -release après pour annuler ce comportement indésirable, et lors de la suppression de la liste juste envoyer -retain avant de le faire? Ou y a-t-il une manière plus élégante?

Que suggérez-vous? Merci a tous!

Répondre

0

Si votre clé de dictionnaire n'est pas conservée, une fois désallouée, l'accès au dictionnaire entraînera un comportement indéfini (en pratique, ils se bloqueront si une recherche arrive à toucher cet élément du dictionnaire). Pour faire ce que vous voulez, vous avez besoin d'une stratégie pour supprimer les objets du dictionnaire si nécessaire.

Si vous en avez un, par exemple, en remplaçant les objets -dealloc et en les supprimant, vous pouvez faire ce que vous voulez en utilisant +[NSValue valueWithNonretainedObject:]. Le NSValue fera référence à votre objet sans le conserver, et le dictionnaire copiera le NSValue (les clés sont copiées, pas conservées). N'oubliez pas de créer un NSValue pour chaque fois que vous souhaitez rechercher quelque chose dans le dictionnaire; Une fonction ou une méthode auxiliaire est une bonne idée.

+0

Lorsque la clé, dans ce cas un NSValue, est copiée: Cela signifie-t-il que l'objet référencé par NSValue n'est pas copié aussi? Ce serait mauvais si les objets sont copiés, car certains d'entre eux peuvent avoir de grandes empreintes de mémoire. –

+0

Non. NSValue est juste un "sac de bits" avec des informations de type attachées, donc une copie exacte copierait simplement le pointeur sur votre objet. Puisque NSValue est immuable, son implémentation de -copy appellera simplement -retain. La distinction serait importante si vous utilisiez vos propres objets comme clés, cependant; ils auraient besoin d'implémenter le protocole NSCopying. –

Questions connexes