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.
podobne pytanie http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-between-objectforkey-and-valueforkey – Gyani