Was ist der Unterschied zwischen objectForKey
und valueForKey
? Ich habe beide in der Dokumentation nachgeschlagen und sie schienen mir gleich zu sein.
quelle
Was ist der Unterschied zwischen objectForKey
und valueForKey
? Ich habe beide in der Dokumentation nachgeschlagen und sie schienen mir gleich zu sein.
objectForKey:
ist eine NSDictionary
Methode. An NSDictionary
ist eine Auflistungsklasse ähnlich einer NSArray
, außer dass anstelle von Indizes Schlüssel zur Unterscheidung zwischen Elementen verwendet werden. Ein Schlüssel ist eine beliebige Zeichenfolge, die Sie angeben. Keine zwei Objekte können denselben Schlüssel haben (so wie keine zwei Objekte in einem NSArray
denselben Index haben können).
valueForKey:
ist eine KVC-Methode. Es funktioniert mit jeder Klasse. valueForKey:
Ermöglicht den Zugriff auf eine Eigenschaft mithilfe einer Zeichenfolge für ihren Namen. Wenn ich beispielsweise eine Account
Klasse mit einer Eigenschaft habe accountNumber
, kann ich Folgendes tun:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
Mit KVC kann ich dynamisch auf die Eigenschaft zugreifen:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Dies sind äquivalente Sätze von Anweisungen.
Ich weiß, dass du denkst: Wow, aber sarkastisch. KVC sieht gar nicht so nützlich aus. In der Tat sieht es "wortreich" aus. Wenn Sie jedoch zur Laufzeit Änderungen vornehmen möchten, können Sie viele coole Dinge tun, die in anderen Sprachen viel schwieriger sind (dies geht jedoch über den Rahmen Ihrer Frage hinaus).
Wenn Sie mehr über KVC erfahren möchten, gibt es viele Tutorials, wenn Sie Google speziell in Scott Stevensons Blog verwenden . Sie können auch die NSKeyValueCoding-Protokollreferenz überprüfen .
Ich hoffe, das hilft.
Wenn Sie dies tun
valueForKey:
, müssen Sie ihm einen NSString geben, währendobjectForKey:
jede NSObject-Unterklasse als Schlüssel verwendet werden kann. Dies liegt daran, dass bei der Schlüsselwertcodierung die Schlüssel immer Zeichenfolgen sind.Tatsächlich heißt es in der Dokumentation, dass selbst wenn Sie
valueForKey:
einen NSString angeben, dieserobjectForKey:
trotzdem aufgerufen wird, es sei denn, die Zeichenfolge beginnt mit einem@
. In diesem Fall wird ein[super valueForKey:]
Aufruf aufgerufen,valueForUndefinedKey:
der möglicherweise eine Ausnahme auslöst .quelle
Hier ist ein guter Grund,
objectForKey:
wo immer möglich zu verwenden , anstattvalueForKey:
-valueForKey:
mit einem unbekannten Schlüssel wird die MeldungNSUnknownKeyException
"Diese Klasse ist nicht für die Schlüsselwertcodierung für den Schlüssel kompatibel" ausgegeben.quelle
Wie gesagt, der
objectForKey:
Datentyp ist,:(id)aKey
während dervalueForKey:
Datentyp ist:(NSString *)key
.Zum Beispiel:
Nimmt also
valueForKey:
nur einen Zeichenfolgenwert an und ist eine KVC-Methode, währendobjectForKey:
jede Art von Objekt verwendet wird.Auf den Wert in
objectForKey
wird von derselben Art von Objekt zugegriffen.quelle
Ich werde versuchen, hier eine umfassende Antwort zu geben. Viele der Punkte erscheinen in anderen Antworten, aber ich fand jede Antwort unvollständig und einige falsch.
In erster Linie
objectForKey:
handelt es sich um eineNSDictionary
Methode, währendvalueForKey:
für jede KVC-Beschwerdeklasse - einschließlich NSDictionary - eine KVC-Protokollmethode erforderlich ist.Wie @dreamlax schrieb, gibt die Dokumentation außerdem Hinweise darauf, dass
NSDictionary
dievalueForKey:
Methode mithilfe ihrerobjectForKey:
Implementierung implementiert wird. Mit anderen Worten -[NSDictionary valueForKey:]
ruft an[NSDictionary objectForKey:]
.Dies impliziert, dass
valueForKey:
dies niemals schneller sein kann alsobjectForKey:
(mit demselben Eingabeschlüssel), obwohl gründliche Tests, die ich durchgeführt habe, einen Unterschied von etwa 5% bis 15% gegenüber Milliarden von Direktzugriffen auf ein riesiges NSDictionary bedeuten. In normalen Situationen ist der Unterschied vernachlässigbar.Weiter: Das KVC-Protokoll funktioniert nur mit
NSString *
Schlüsseln undvalueForKey:
akzeptiert daher nur eineNSString *
(oder Unterklasse) als Schlüssel, währendNSDictionary
es mit anderen Arten von Objekten als Schlüssel arbeiten kann - so dass die "untere Ebene"objectForKey:
jedes kopierbare (NSCopying-Protokoll-kompatible) Objekt akzeptiert als Schlüssel.Schließlich weicht die
NSDictionary's
ImplementierungvalueForKey:
von dem in der KVC-Dokumentation definierten Standardverhalten ab und gibt KEINENNSUnknownKeyException
für einen Schlüssel aus, den es nicht finden kann - es sei denn, dies ist ein "spezieller" Schlüssel - der mit '@' beginnt - was normalerweise ein "bedeutet. Aggregation "Funktionstaste (zB@"@sum, @"@avg"
). Stattdessen wird einfach eine Null zurückgegeben, wenn kein Schlüssel im NSDictionary gefunden wird - und verhält sich genauso wieobjectForKey:
Es folgt ein Testcode, um meine Notizen zu demonstrieren und zu beweisen.
quelle