353 votes

Différence entre objectForKey et valueForKey?

Quelle est la différence entre objectForKey et valueForKey? J'ai regardé les deux dans la documentation et ils semblaient la même chose pour moi.

406voto

Corey Floyd Points 16747

objectForKey: est NSDictionary méthode. Un NSDictionary est une classe de collection similaire à un NSArray, sauf qu'au lieu d'utiliser des index, il utilise des clés pour différencier entre les éléments. Une clé est une chaîne de caractères arbitraire que vous fournissez. Pas de deux objets peuvent avoir la même clé (comme pas deux objets dans un NSArray peut avoir le même indice).

valueForKey: est un KVC méthode. Il fonctionne avec n'IMPORTE quelle classe. valueForKey: vous permet d'accéder à une propriété à l'aide d'une chaîne de caractères pour le nom. Ainsi, par exemple, si j'ai un Account classe avec une propriété accountNumber, je peux faire ce qui suit:

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];

[newAccount setAccountNumber:anAccountNUmber];

NSNumber *anotherAccountNumber = [newAccount accountNumber];

À l'aide de KVC, je peux accéder à la propriété de façon dynamique:

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];

[newAccount setValue:anAccountNumber forKey:@"accountNumber"];

NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];

Ceux-ci sont l'équivalent des ensembles d'états.

Je sais que vous êtes en train de penser: wow, mais de manière sarcastique. KVC ne regarde pas tout ce qui utile. En fait, il semble "verbeux". Mais quand vous voulez changer les choses au moment de l'exécution, vous pouvez faire beaucoup de choses cool que beaucoup plus difficile dans d'autres langues (mais c'est au-delà de la portée de votre question).

Si vous voulez en savoir plus sur KVC, il existe de nombreux tutoriels si vous Google en particulier à Scott Stevenson blog. Vous pouvez aussi consulter les NSKeyValueCoding Protocole de Référence.

Espérons que cela aide.

64voto

dreamlax Points 47152

Lorsque vous effectuez valueForKey: vous avez besoin de lui donner un NSString, alors qu' objectForKey: peut prendre n'importe quelle sous-classe NSObject comme une clé. C'est parce que pour la Valeur-Clé de Codage, les touches sont toujours des chaînes de caractères.

En fait, la documentation indique que, même quand vous donnez valueForKey: un NSString, il appellera objectForKey: de toute façon, sauf si la chaîne commence par un @, auquel cas il invoque [super valueForKey:], qui peut appeler, valueForUndefinedKey: qui peut lever une exception.

20voto

Nick Locking Points 419

Voici une bonne raison d'utiliser objectForKey: chaque fois que possible au lieu de valueForKey: - valueForKey: avec une clé inconnue va jeter NSUnknownKeyException disant: "ce cours n'est pas la valeur de la clé de codage conforme à la clé ".

13voto

Harry Points 570

Il y avait tellement de bonnes réponses sont affichées. Je veux juste ajouter que mes idées pour aider les autres avec l'utilisation de simple exemple.

Comme l'a dit, objectForKey: type de données est - :(id)aKey alors qu' valueForKey: type de données est - :(NSString *)key.

Exemple:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil];
NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]);  //This will work fine and prints (    123    )


NSLog(@"valueForKey  : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]); //it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'"     ---- This will crash on runtime.  

Donc, valueForKey: permettra de ne prendre que de la chaîne de valeur et est un KVC méthode. Alors qu' objectForKey: vont prendre n'importe quel type d'objet. REMARQUE: La valeur en objectForKey seront accessibles par le même type d'objet.

L'espoir qui ajoute un autre aperçu de réponse à la question précédente.

Harry

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