7 votes

Exception NSInvalidArgumentException/copyWithZone avec NSMutableDictionary

J'ai une classe avec laquelle j'encapsule ABRecordID et lorsqu'elle est utilisée comme clé pour ajouter à un NSMutableDictionary, j'obtiens l'exception d'exécution :

"NSInvalidArgumentException : *** -[MyRecordId copyWithZone :]: unrecognized selector sent to instance"

MyRecordId déclaré comme :

@interface MyRecordId : NSObject {
    ABRecordID abRecordId;
}

-(id)initWithId:(ABRecordID)anABRecordId;
@property (nonatomic) ABRecordID abRecordId;

@end

Ajouté au dictionnaire :

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
MyRecordId *recordId = [[MyRecordId alloc] initWithId:anABRecordId];
[dict setObject:@"hello" forKey:recordId];

La dernière ligne provoque l'exception.. Je sais que l'on ne peut pas stocker des types de non-objets en tant que clés d'un dictionnaire, mais j'ai pensé qu'en l'enveloppant dans une classe dérivée de NSObject, tout irait bien.

Ne suis-je pas censé stocker ABRecordID dans d'autres objets ? Devrais-je faire autre chose ?

7voto

Marco Mustapic Points 3327

Utilisez NSNumber pour stocker l'ABRecordID dans une classe Obj-C :

[dict setObject:@"hello" forKey:[NSNumber numberWithInt:recordId]];

pour obtenir à nouveau le recordId, faites :

recordId = [[dict objectForKey:@"hello"] intValue];

6voto

Chuck Points 138930

Les clés NSDictionary doivent mettre en œuvre le protocole NSCopying. C'est pourquoi il vous dit que votre objet ne répond pas à copyWithZone: .

6voto

diederikh Points 17459

La classe de l'objet que vous utilisez comme valeur de la clé doit être conforme à la classe de l'objet. NSCopying protocole. Fondamentalement, il devrait mettre en œuvre le copyWithZone: méthode.

Au lieu d'utiliser votre propre classe pour envelopper votre variable non-objet, vous devriez utiliser NSValue qui est conçue à cette fin et prend en charge la classe NSCopying protocole.

1voto

Symmetric Points 1581

Pour ceux qui, comme moi, ont du mal à coder, assurez-vous que les arguments de setObject sont dans le bon sens. Je viens de perdre des heures sur cette erreur avant de remarquer que je les avais inversés !

0voto

Alexi Groove Points 2606

Vous pouvez également utiliser NSNumber à cette fin, car il hérite de NSValue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X