Quelle est la difference entre objectForKey
et valueForKey
? J'ai regardé les deux dans la documentation et ils m'ont semblé les mêmes.
Quelle est la difference entre objectForKey
et valueForKey
? J'ai regardé les deux dans la documentation et ils m'ont semblé les mêmes.
objectForKey:
est une NSDictionary
méthode. An NSDictionary
est une classe de collection similaire à an 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 objets ne peuvent pas avoir la même clé (tout comme aucun objet dans un NSArray
ne peut 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. Ainsi, par exemple, si j'ai une 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];
En utilisant KVC, je peux accéder dynamiquement à la propriété:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Ce sont des ensembles d'instructions équivalents.
Je sais que tu penses: wow, mais sarcastique. KVC ne semble pas très utile. En fait, ça a l'air "verbeux". Mais lorsque vous voulez changer des choses au moment de l'exécution, vous pouvez faire beaucoup de choses sympas qui sont beaucoup plus difficiles dans d'autres langues (mais cela dépasse la portée de votre question).
Si vous voulez en savoir plus sur KVC, il existe de nombreux tutoriels si vous 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 le faites,
valueForKey:
vous devez lui donner une NSString, alors que vousobjectForKey:
pouvez prendre n'importe quelle sous-classe NSObject comme 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 NSString, elle sera invoquée deobjectForKey:
toute façon à moins que la chaîne ne commence par un@
, auquel cas elle invoque[super valueForKey:]
, qui peut appelervalueForUndefinedKey:
ce qui peut déclencher une exception.la source
Voici une excellente raison d'utiliser
objectForKey:
autant que possible au lieu devalueForKey:
-valueForKey:
avec une clé inconnue, onNSUnknownKeyException
dira "cette classe n'est pas conforme au codage de la valeur de clé pour la clé".la source
Comme dit, le
objectForKey:
type de données est:(id)aKey
alors que levalueForKey:
type de données l'est:(NSString *)key
.Par exemple:
Ainsi,
valueForKey:
ne prendra qu'une valeur de chaîne et est une méthode KVC, tandis queobjectForKey:
prendra tout type d'objet.La valeur de
objectForKey
sera accessible par le même type d'objet.la source
Je vais essayer de fournir une réponse complète ici. La plupart des points apparaissent dans d'autres réponses, mais j'ai trouvé chaque réponse incomplète et certaines incorrectes.
Tout d'abord,
objectForKey:
est uneNSDictionary
méthode, tandisvalueForKey:
qu'une méthode de protocole KVC est requise pour toute classe de plainte KVC - y compris NSDictionary.En outre, comme l'a écrit @dreamlax, la documentation indique la
NSDictionary
mise en œuvre de savalueForKey:
méthode en utilisant sonobjectForKey:
implémentation. En d'autres termes -[NSDictionary valueForKey:]
appelle[NSDictionary objectForKey:]
.Cela implique que
valueForKey:
cela ne peut jamais être plus rapide queobjectForKey:
(sur la même clé d'entrée), bien que des tests approfondis que j'ai effectués impliquent une différence d'environ 5% à 15%, sur des milliards d'accès aléatoire à un énorme NSDictionary. Dans des situations normales - la différence est négligeable.Suivant: Le protocole KVC ne fonctionne qu'avec des
NSString *
clés, doncvalueForKey:
n'accepteraNSString *
qu'une clé (ou sous-classe) comme clé, tout enNSDictionary
pouvant fonctionner avec d'autres types d'objets comme clés - de sorte que le "niveau inférieur"objectForKey:
accepte tout objet copiable (compatible avec le protocole NSCopying) comme clé.Enfin, l'
NSDictionary's
implémentation devalueForKey:
s'écarte du comportement standard défini dans la documentation de KVC et n'émettra PASNSUnknownKeyException
de clé qu'il ne trouve pas - sauf s'il s'agit d'une clé "spéciale" - qui commence par "@" - ce qui signifie généralement un " agrégation "touche de fonction (par exemple@"@sum, @"@avg"
). Au lieu de cela, il retournera simplement un zéro lorsqu'aucune clé ne sera trouvée dans le NSDictionary - se comportant de la même manière queobjectForKey:
Voici un code de test pour démontrer et prouver mes notes.
la source