Différence entre objectForKey et valueForKey?

Quelle est la différence entre objectForKey et valueForKey ? J’ai regardé tous les deux dans la documentation et ils me semblaient pareils.

objectForKey: est une méthode NSDictionary . 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 les éléments. Une clé est une chaîne arbitraire que vous fournissez. Deux objects ne peuvent pas avoir la même clé (tout comme deux objects dans un NSArray ne peuvent pas avoir le même index).

valueForKey: est une méthode KVC. Cela fonctionne avec n’importe quelle classe. valueForKey: vous permet d’accéder à une propriété en utilisant une chaîne pour son nom. Par exemple, si j’ai une classe de Account avec un accountNumber Account de propriété, je peux procéder comme suit:

 NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; Account *newAccount = [[Account alloc] init]; [newAccount setAccountNumber:anAccountNUmber]; NSNumber *anotherAccountNumber = [newAccount accountNumber]; 

En utilisant KVC, je peux accéder à la propriété de manière dynamic:

 NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; Account *newAccount = [[Account alloc] init]; [newAccount setValue:anAccountNumber forKey:@"accountNumber"]; NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"]; 

Ce sont des ensembles de déclarations équivalents.

Je sais que vous pensez: wow, mais sarcastique. KVC ne semble pas très utile. En fait, ça a l’air “verbeux”. Mais quand vous voulez changer les choses à l’exécution, vous pouvez faire plein de choses bien plus difficiles dans d’autres langues (mais cela dépasse le cadre de votre question).

Si vous voulez en savoir plus sur KVC, il existe de nombreux tutoriels si vous utilisez Google, en particulier sur le blog de Scott Stevenson . Vous pouvez également consulter la référence du protocole NSKeyValueCoding .

J’espère que cela pourra aider.

Lorsque vous faites valueForKey: vous devez lui atsortingbuer un NSSsortingng, alors que objectForKey: peut prendre n’importe quelle sous-classe NSObject en tant que clé. En effet, pour le codage valeur-clé, les clés sont toujours des chaînes.

En fait, la documentation indique que même lorsque vous donnez valueForKey: une NSSsortingng, elle invoquera objectForKey: moins que la chaîne ne commence par un @ , auquel cas elle appelle [super valueForKey:] , qui peut appeler valueForUndefinedKey: exception.

Voici une bonne raison d’utiliser objectForKey: chaque fois que possible au lieu de valueForKey:valueForKey: avec une clé inconnue, NSUnknownKeyException “cette classe n’est pas compatible avec le codage de la valeur de clé”.

Comme indiqué objectForKey: , le type de données objectForKey: est :(id)aKey alors que le type de valeur valueForKey: est la :(NSSsortingng *)key .

Par 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 'NSSsortingng *'" ---- This will crash on runtime. 

Ainsi, valueForKey: prendra uniquement une valeur de chaîne et est une méthode KVC, tandis que objectForKey: prendra tout type d’object.

La valeur dans objectForKey sera accessible par le même type d’object.