2010-12-20 7 views
34

mam 2 pytania:Jaka jest różnica między valueforKey :, objectForKey :, a valueForKeyPath :?

  1. Jaka jest różnica między valueForKey: i objectForKey:? Czy to jest dla NSDictionary s (objectForKey:), a dla innych jest valueforKey:, czy jest odwrotnie?

  2. Jaka jest różnica między valueForKey: a valueForKeyPath:? Czy ma to coś wspólnego z Core Data?

Proszę o pomoc.

+3

podobne pytanie http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-between-objectforkey-and-valueforkey – Gyani

Odpowiedz

59

valueForKey: jest częścią protokołu NSKeyValueCoding i dlatego jest częścią ram klucz-wartość kodowania, która pozwala na dostęp do właściwości klasy wg nazwy przy starcie. Na przykład ładowane są NIB-y - ładowane są nazwy właściwości powiązanych z połączeniami, a następnie wartości są ustawiane bezpośrednio według nazwy. Kontrastuje to ze sposobem, w jaki narzędzia do projektowania graficznego często działają w innych językach, generując wiele ukrytych statycznie skompilowanych kodów.

objectForKey: jest zdefiniowany tylko w słownikach i wyszukuje obiekt za pomocą klucza. NSDictionary to klasa przechowująca połączenia między wartościami i kluczami.

Tak, może być użyty w NSDictionary do zwrócenia informacji meta o słowniku, takich jak liczba obiektów w nim, lista wszystkich kluczy, itp. objectForKey: byłby używany do zaglądania do słownika.

W czasie wykonywania różnica polega na tym, że objectForKey: jest metodą z całkowicie nieprzezroczystą implementacją. valueForKey: jawnie polega na wywołaniu nazwanych modułów pobierających i ustawiających. Powodem tego ostatniego jest to, że możesz rozszerzyć kodowanie wartości kluczowej na obserwowanie wartości klucz-wartość, gdzie prosisz o informacje za każdym razem, gdy zmieni się konkretna właściwość danego obiektu. W środowisku wykonawczym, które osiąga się za pomocą metody swizzle, gdzie oryginalny ustawiający jest zamieniany na nowy, który wywołuje poprzedni seter, a następnie wysyła wymagane komunikaty. Ponieważ wszystkie komunikaty są wywoływane dynamicznie, osiąga się to po prostu przez modyfikowanie tabel w instancji obiektu.

Tak więc każdy obiekt, który jest zgodny z kodowaniem kluczem wartościowym (co po prostu oznacza deklarowanie i implementowanie twoich właściwości we właściwy sposób, który automatycznie otrzymuje składnia new-ish @ właściwość/@ synthesize) może być obserwowany bez samego obiektu zaimplementować dowolny kod.

Są jeszcze inne produkty Apple, które wykorzystują kodowanie wartości kluczowej, aby osiągnąć różne rzeczy, w tym CoreData, ale nie chodzi o to, by włączyć jakąkolwiek inną technologię.

valueForKeyPath: jest podobny do valueForKey: z tym wyjątkiem, że może przechodzić przez kilka obiektów. Tak więc możesz mieć obiekt główny z wieloma właściwościami, każda z tych właściwości jest innym obiektem z inną grupą właściwości, itd., A używanie ścieżki klucza umożliwia uzyskanie wartościowego wyjścia poza strukturę danych, zamiast iterować obiekt po obiekcie dla siebie.

Podsumowując, valueForKey: i valueForKeyPath: dostarczają informacji o instancjach obiektów i współdziałają z dynamiczną naturą środowiska wykonawczego Objective-C. objectForKey: to specyficzna dla słownika metoda, która wykonuje zadania słownikowe.

Dodatki:

Przykład kodowana jak rodzaj i przy założeniu, że jest kluczem NSDictionary wartość kodowania zgodne:

NSDictionary *someDictionary; 
// create someDictionary, populate it, for example (note: we assume photoOfKeys.jpg 
// definitely exists, not a good idea for production code — if it doesn't we'll get 
// a nil there and anything after it won't be added to the dictionary as it'll appear 
// that we terminated the list): 
someDictionary = @{ @"favouriteGarment": @"hat", 
        @"@allKeys"  : [NSImage imageNamed:NSImageNameDotMac], 
        @(2)    : NSArray.new }; 

NSObject *allKeys; 
// we make no assumptions about which type @allKeys will be, but are going to assume 
// we can NSLog it, so it needs to be a descendant of NSObject rather than 'id' so as 
// to definitely respond to the 'description' message — actually this is just compile 
// time semantics, but if someone else reads this code it'll make it obvious to them 
// what we were thinking... 

// some code to get all of the keys stored in the dictionary and print them out; 
// should print an array containing the strings 'favouriteGarment', '@allKeys' and 
// the number 2 
allKeys = [someDictionary valueForKey:@"@allKeys"]; 
NSLog(@"%@", allKeys); 

// some code to get the object named '@allKeys' from the dictionary; will print 
// a description of the image created by loading photoOfKeys.jpg, above 
allKeys = [someDictionary objectForKey:@"@allKeys"]; 
NSLog(@"%@", allKeys); 
// `objectForKey is analogous to `objectForKeyedSubscript:`, aka 
allKeys = someDictionary[@"@allKeys"]; 

allKeys jest właściwością NSDictionary opisanym here. Dodałem też mapowanie z klawiszy NSString do zdjęcia niektórych klawiszy. Niezależnie od tego, czy używam metod kodowania klucz-wartość, czy też metoda wyszukiwania NSDictionary objectForKey:, dyktuje, czy odczytuję właściwość wystąpienia obiektu, czy wysyłam instancję obiektu komunikat z prośbą, aby wykonał swoje unikalne zadanie.

+0

Jestem nieco zdezorientowany, jeśli chodzi o użycie valueForKey: i objectForKey: w słowniku. Kiedy mówisz, że valueForKey może być użyty w NSDictionary do zwrócenia informacji meta na temat słownika, takich jak liczba obiektów w nim zawartych, lista wszystkich kluczy, itp. Czy mógłbyś pokazać na przykładzie, co by zwrócił tak, że jestem trochę świadomy różnicy. – hmthur

+0

@hmthur Oto kilka dobrych przykładów [tutaj] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/ArrayOperators.html%23//apple_ref/doc/uid/20002176 -BAJEAIEEhttp: //developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/ArrayOperators.html%23//apple_ref/doc/uid/20002176-BAJEAIEE) –

+1

Myślę, że @ "allKeys" powinno być @ "allKeys" w przykładzie. –

1
  1. valueForKey: i valueAtKeyPath: są metody określone w protokole NSKeyValueCoding nieformalnego i implementacje domyślne są świadczone zarówno przez klasę głównego NSObject.

    objectForKey: to metoda na NSDictionary.

  2. valueForKey: bierze klucz do nieruchomości, a valueAtKeyPath: przyjmuje tak zwany keypath. Funkcja keypath określa ścieżkę do określonej właściwości, na przykład @"relationship.property".

17
  1. objectForKey: to metoda na NSDictionary w celu uzyskania dostępu do obiektu powiązanego z kluczem. valueForKey: to metoda na NSObject uzyskiwania dostępu do dowolnej wartości skojarzonej z dowolnym obiektem, poprzez nazwę metody, właściwości i/lub zmiennej instancji.
  2. valueForKeyPath: może być postrzegany jako skrót dla kilku połączeń z numerem valueForKey:. Możesz to traktować jako rodzaj xpath, jeśli chcesz.

Te dwa oświadczenia spowoduje tym samym wyjście:

// Using nested valueForKey: 
NSLog(@"%@", [[myObject valueForKey:@"foo"] valueForKey:@"bar"]); 
// Can be done with a single valueForKeyPath; 
NSLog(@"%@", [myObject valueForKeyPath:@"foo.bar"]); 

valueForKey: i valueForKeyPath: są częścią KVC (Key Value Coding). Wprowadzenie i dogłębne można znaleźć dokumentację tutaj: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/

Powiązane problemy