2013-08-03 15 views
9

Próbuję nauczyć się obiektywu c przy użyciu dużej książki o nerdach, jest to naprawdę świetna książka, ale niektóre aspekty mnie mylą.Objective-C setValue: forKey na c podstawowych typów

Obecny rozdział mówi o użyciu funkcji setValue: forKey, którą rozumiem jest metodą zdefiniowaną w NSObject. Książka mówi, że można to wykorzystać na ac prymitywnego jak int lub float i daje tym przykładzie

Mam niestandardowej klasy o nazwie Appliance aw nim jest całkowitą instancja zmiennej o nazwie Napięcie która przechowuje napięcie prąd urządzenie zainicjować nowe urządzenie o nazwie

appliance *a = [[appliance alloc]init]; 
[a setValue:[NSNumber numberWithInt:240] forKey:@"voltage"]; 

potem ustawia niestandardową setter dla napięcia i rejestruje napięcia przy jego nazwie, aby udowodnić, że działa

-(void)setVoltage:int(x) { 
NSLog(@"setting voltage to %d",x); 
voltage =x; 
} 

co jest mylące, że numer NSNumberWithInt zwraca wskaźnik do obiektu NSNumber zapisanego na stercie? więc w jaki sposób rejestruje liczbę całkowitą przechowywaną w NSNumber przy użyciu tokena% d. Rozumiem, że logowałbym liczbę całkowitą, ale czy obiekt nie jest przekazywany? ponadto pomyślałem, że skoro napięcie zostało zdefiniowane jako liczba całkowita, a nie wskaźnik do czegoś, to nie mogło pomieścić adresu obiektu w swojej pamięci? lub czy NSNumber zmusza go do przechowywania adresu pamięci bez zadeklarowania napięcia jako wskaźnika?

Przepraszam za zamieszanie, ten rozdział po prostu kopnął mnie w tyłek.

+3

Należy zauważyć, że w normalnych praktykach kodowania, zazwyczaj nie używałbyś 'setValue: forKey:' lub 'valueForKey:' do ustawiania/otrzymywania wartości na obiekcie *. Po prostu wywołaj bezpośrednio setter/getter. KVC w dużej mierze istnieje, aby wspierać takie rzeczy jak wiązania i inne formy meta-programowania. – bbum

Odpowiedz

25

Konwersja między obiektami i typami skalarnymi jest obsługiwana automatycznie za pomocą metod kodowania klucz-wartość. Z documentation:

implementacje domyślne valueForKey: i setValue:forKey: zapewnić wsparcie dla automatycznego zawijania obiektu danych non-object typów, zarówno skalary i strukturach.

Po valueForKey: ustalił konkretnej metody dostępowej lub wystąpienia zmienną, która jest wykorzystywana do dostarczania wartości dla określonego klucza, sprawdza się typ zwrotny lub typ danych. Jeśli zwrócona wartość nie jest obiektem, to obiekt NSNumber lub NSValue zostanie utworzony dla tej wartości i zwrócony na miejsce.

Podobnie, setValue:forKey: określa typ danych wymagany przez odpowiednią właściwość lub zmienną instancji dla określonego klucza. Jeśli typ danych nie jest obiektem, to wartość jest wyodrębniana z obiektu przekazanego przy użyciu odpowiedniej metody -<type>Value.

Więc w twoim przypadku, intValue stosowana jest automatycznie przekazywana do NSNumber obiektu i uzyskaną liczbą całkowitą jest przekazywana do setVoltage:.

4

Masz rację pod tym względem, że tworzysz instancję NSNumber i przekazujesz ją. Ale przekazujesz go do setValue:forKey: i robi to dla ciebie.To jest znalezienie odpowiedniej metody ustawiającej dla voltage (setVoltage:), sprawdzanie typu danych i rozpakowywanie numeru do int przed wywołaniem ustawiacza.

Powiązane problemy