354 Stimmen

Unterschied zwischen objectForKey und valueForKey?

Was ist der Unterschied zwischen objectForKey y valueForKey ? Ich habe in der Dokumentation nachgeschaut, und sie scheinen mir gleich zu sein.

406voto

Corey Floyd Punkte 25849

objectForKey: ist eine NSDictionary Methode. Eine NSDictionary ist eine Sammelklasse ähnlich einer NSArray mit dem Unterschied, dass es anstelle von Indizes Schlüssel verwendet, um zwischen den Elementen zu unterscheiden. Ein Schlüssel ist eine beliebige Zeichenkette, die Sie angeben. Keine zwei Objekte können den gleichen Schlüssel haben (genauso wie keine zwei Objekte in einer NSArray können den gleichen Index haben).

valueForKey: ist eine KVC-Methode. Sie funktioniert mit JEDER Klasse. valueForKey: ermöglicht den Zugriff auf eine Eigenschaft mit einer Zeichenkette als Namen. Wenn ich also zum Beispiel eine Account Klasse mit einer Eigenschaft 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 gleichwertige Sätze von Aussagen.

Ich weiß, dass Sie denken: "Wow", aber das war sarkastisch gemeint. KVC sieht gar nicht so nützlich aus. Tatsächlich sieht es "wortreich" aus. Aber wenn Sie Dinge zur Laufzeit ändern wollen, können Sie viele coole Dinge tun, die in anderen Sprachen viel schwieriger sind (aber das geht über den Rahmen Ihrer Frage hinaus).

Wenn Sie mehr über KVC erfahren möchten, gibt es viele Anleitungen, wenn Sie googeln, insbesondere unter Der Blog von Scott Stevenson . Sie können sich auch die NSKeyValueCoding Protokoll-Referenz .

Ich hoffe, das hilft.

63voto

dreamlax Punkte 91447

Wenn Sie das tun valueForKey: müssen Sie ihm einen NSString geben, während objectForKey: kann jede NSObject-Unterklasse als Schlüssel verwenden. Der Grund dafür ist, dass bei der Schlüssel-Wert-Kodierung die Schlüssel immer Strings sind.

In der Dokumentation heißt es nämlich, dass selbst wenn Sie valueForKey: einen NSString, ruft es auf objectForKey: es sei denn, die Zeichenkette beginnt mit einem @ und ruft in diesem Fall Folgendes auf [super valueForKey:] die Folgendes aufrufen können valueForUndefinedKey: was eine Ausnahme auslösen kann.

21voto

Nick Locking Punkte 2087

Hier ist ein guter Grund für die Verwendung von objectForKey: wo immer möglich anstelle von valueForKey: - valueForKey: mit einem unbekannten Schlüssel führt zu NSUnknownKeyException mit dem Hinweis "Diese Klasse ist nicht schlüsselwertkodierungskonform für den Schlüssel ".

13voto

Harjot Singh Punkte 6307

Wie gesagt, die objectForKey: Datentyp ist :(id)aKey während die valueForKey: Datentyp ist :(NSString *)key .

Zum Beispiel:

 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. 

Also, valueForKey: nimmt nur einen String-Wert an und ist eine KVC-Methode, während objectForKey: kann jede Art von Objekt annehmen.

Der Wert in objectForKey wird durch dieselbe Art von Objekt zugegriffen werden.

3voto

Andy Jazz Punkte 34407

Diese Tabelle zeigt vier Unterschiede zwischen objectForKey y valueForKey .

objectForKey

valueForKey

Arbeitet an ...

NSDictionary

NSDictionary / KVC

Wirft die Ausnahme

Nein

Ja (auf KVC)

Futtermittel

Die Unterklasse von NSObject

NSString

Verwendung auf KVC

no puede

kann

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X