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: maintenant qui me donne une erreur, disant p> - [ObjectA CopyWithzone:]: Sélecteur non reconnu envoyé à l'instance p>
blockQuote> 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. P> 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 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. p> p>
Dictionnaire ObjectForkey: MyObitta CODE> 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? P>
4 Réponses :
Vous pouvez transformer un 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> ID code> en une nsvalue avec:
NSMapTable* dict = [[NSMapTable mapTableWithStrongToStrongObjects] retain];
...
[dict setObject:@"?" forKey:foo];
...
[dict release];
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.
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 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. P>
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 En outre, vous devez implémenter la méthode code> iSequal: code> pour votre classe. P>
Copywithzone: code> méthode. P>
CopyWithzone: CODE> 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 . P>
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 code> si vous implémentez
-sequal: code> si deux objets sont égaux comme déterminé par
-isequal: code> alors ils doivent avoir la même chose valeur hachage.
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. p>