7
votes

Touches d'objet avec Nsmutmédictionnement (Objective-C)

Je veux stocker une bande de paires de la valeur clé, la clé étant mon propre objet (Objecta) qui hérite de NsObject et la valeur étant un int. J'essaie d'utiliser un Nsmutabledictionner. Je comprends que vous ne pouvez stocker que des types d'objets dans le dictionnaire, alors j'ai ce qui suit: xxx

maintenant qui me donne une erreur, disant

- [ObjectA CopyWithzone:]: Sélecteur non reconnu envoyé à l'instance

C'est bien, je comprends que les touches d'objet doivent mettre en œuvre le protocole NScopiant. Cependant, je lisai ensuite que vous pouvez le faire en enveloppant vos objets à l'aide de NSValue.

Peut-on expliquer comment je voudrais expliquer mes objets et comment puis-je trouver la valeur par la clé? Suis-je toujours en mesure d'utiliser Dictionnaire ObjectForkey: MyObitta ou dois-je envelopper MyObite avec un objet NSValue pendant que je cherche aussi? Ou devrais-je mettre en œuvre NScopying sur ma classe personnalisée ou utiliser une clé à chaîne à la place?

Je cherche ce moyen le plus simple et le plus simple d'utiliser un dictionnaire, si je dois devrai implémenter une clé de chaîne et utiliser SETValue: Forey: Au lieu de cela, mais je préfère utiliser la clé d'objet si je peux.


0 commentaires

4 Réponses :


6
votes

Vous pouvez transformer un ID code> en une nsvalue avec: xxx pré>

mais vous devez gérer la propriété en dehors du dictionnaire. Cela va être un gâchis. Il vaut mieux adopter NScopying. P>


Il existe également une 4ème option: utilisez un CFDictionary, qui permet à l'objet uniquement peut être cfretain / Cfreleased, non copié. P>

NSMapTable* dict = [[NSMapTable mapTableWithStrongToStrongObjects] retain];
...
[dict setObject:@"?" forKey:foo];
...
[dict release];


1 commentaires

Merci pour le conseil sur l'utilisation de NSValue. Je n'étais pas au courant de cet utilitaire et c'était juste ce dont j'avais besoin. Semble une solution plus aproposée au problème.



0
votes

Vous n'avez pas besoin d'envelopper votre objet en utilisant NSValue. Ce que vous avez fonctionnerez, sauf que vous manquez une pièce. Pour la classe de MyObitta, vous devez adopter le protocole NScopying (voir les docs pour que d'ajouter). Une fois que cela a ajouté le code que vous avez affiché ci-dessus devrait fonctionner correctement.

Vous voudrez peut-être envisager d'utiliser des chaînes cependant sur votre propre objet pour la clé. La clé est nécessaire pour être une chaîne si le codage de la valeur clé va être utilisé pour y accéder du tout. Ainsi, l'utilisation d'une chaîne facilitera la vie si vous pouvez profiter du codage de la valeur de clé, où vous utilisez le dictionnaire.


0 commentaires

10
votes

Les clés de dictionnaire sont toujours copiées. Donc, vous avez simplement besoin d'implémenter le NScopying protocole de votre classe, qui n'est que la copie Copywithzone: méthode.

En outre, vous devez implémenter la méthode iSequal: pour votre classe.

Modifier: Comment implémenter votre CopyWithzone: dépend d'un certain nombre de facteurs (facteur principal: dépôt profond et peu profond). Voir Apple's Implémentation d'objet Copie guide et Cela répond donc .


2 commentaires

Pourriez-vous vous étendre de manière à inclure ce que je voudrais mettre dans ma mise en œuvre de la copieWithzone dans ma propre classe?


Vous devez implémenter -HASH si vous implémentez -sequal: si deux objets sont égaux comme déterminé par -isequal: alors ils doivent avoir la même chose valeur hachage.



2
votes

Dans iOS 6, vous pouvez utiliser NSMAPTABLE ( https://developer.apple.com/library/ios/#documentation/cocoa/reference/nsmaptable_class/reference/nsmaptable.html ), ce qui vous permet de choisir des attributs faibles / solides pour les clés et les objets.


0 commentaires