2010-08-22 10 views

Odpowiedz

16

Nie są one innym sposobem, aby wysłać wiadomość do obiektu, są jedynym sposobem. Na przykład w [myView setValue:@"foo"], setValue: jest selektorem. (Innym, mniej wygodnym sposobem napisania tego samego jest objc_msgSend(myView, @selector(setValue:), @"foo").)

Jak mówi Ian Henry, można użyć wartości SEL, aby wybrać selektor w środowisku wykonawczym zamiast w czasie kompilacji. Jest to podstawowa technika w kakao; interfejsy użytkownika są zazwyczaj połączone z kontrolerami za pomocą powiązań cel/działanie, gdzie obiekt docelowy jest obiektem, a akcja jest selektorem. Normalnie to ustawić w stalówkę, ale można też zrobić to w kodzie:

[myButton setTarget:myController]; 
[myButton setAction:@selector(buttonClicked:)]; // Clicking the button will now call [myController buttonClick:myButton]. 
+1

Świetna odpowiedź, ale jaka jest korzyść z wykonania: [myButton setAction: @selector (buttonClicked)] Zamiast wysyłać wiadomość bezpośrednio do myController za pomocą "normalnego" komunikatu? – lampShade

+3

Ustawiając akcję, wiadomość zostanie wysłana po kliknięciu przycisku. Jeśli wyślesz wiadomość bezpośrednio, stanie się ona "teraz" (tj. Po skonfigurowaniu interfejsu użytkownika). Posiadanie wszystkich przycisków klikniętych natychmiast po załadowaniu okna nie jest na ogół przydatne. –

+1

Pozwól, że się upewnię, że rozumiem, o czym mówisz. powiedzmy, że mam przycisk, myButton, który jest w interfejsie użytkownika. Jeśli skonfiguruję "normalną" akcję docelową w programie budującym interfejs. Powiedzmy, że mam metodę o nazwie addItem. Po załadowaniu interfejsu automatycznie wywoływana jest metoda addItem - nawet jeśli użytkownik nie włączył przycisku? – lampShade

3

Najprościej mówiąc, tak, ale możesz zmienić wiadomość w czasie wykonywania. Na przykład:

SEL a = [selectorFactory getSelector]; 
[someOtherObject performSelector:a]; 

a potem w selectorFactory.getSelector:

if(foo == 1) 
    return @selector(thisSelector); 
else 
    return @selector(thatSelector); 

Coming od C# lub innym podobnym języku, można to wykorzystać do (luźno) znacznie łatwiej niż przy użyciu NSNotification s symulacji zdarzeń. Na przykład można utworzyć klasę przycisków z dwoma znakami iv, target i selector, a przycisk po kliknięciu wykonuje przycisk wyboru na obiekcie docelowym (na przykład).

Jest jednak o wiele więcej niż selektorów. Czytaj więcej o nich tutaj:

http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/articles/ocSelectors.html

4

selektorów można zapisać jako zmienne i wywołać je później lub w innym kontekście. Na przykład możesz powiedzieć obiektowi, aby wykonał selektor w określonym czasie lub w innym wątku. Możesz również wybrać selektor do wykonania na podstawie danych, w jaki sposób program budujący interfejs i dane podstawowe wykonują swoje zadania.

21

Selektory są zwykle używane, gdy chcesz zdefiniować mechanizm zwrotny. Najczęstszym przypadkiem użycia selektorów w kakao są elementy sterujące, takie jak przyciski. Numer UIButton jest bardzo ogólny i jako taki nie ma pojęcia, co powinno się stać po naciśnięciu przycisku. Zanim będziesz mógł skorzystać z jednego, musisz powiedzieć, jaka metoda powinna zostać uruchomiona po naciśnięciu przycisku. Odbywa się to w następujący sposób:

[myButton addTarget:self 
      action:@selector(myButtonWasPressed) 
    forControlEvents:UIControlEventTouchUpInside]; 

- (void)myButtonWasPressed { 
    // Do something about it 
} 

Następnie, po naciśnięciu przycisku, przycisk wywoła wybierak na cel, którym go minęliśmy. Dzięki temu mechanizmowi nie musisz podklasować przycisku za każdym razem, gdy chcesz wywołać jakiś własny kod. Zamiast tego sam UIButton ma ogólny mechanizm wysyłania do dowolnego wybranego kodu. (Dobrze, technicznie, to nadklasą UIControl który jest zapewnienie mechanizmu wysyłki).

0

--from firmy Apple Developer Biblioteka -

Selektor to nazwa służy do wyboru metody do wykonania dla danego obiektu, lub unikalny identyfikator, który zastępuje nazwę podczas kompilacji kodu źródłowego. Selektor sam w sobie nic nie robi. Po prostu identyfikuje metodę. Jedyną rzeczą, która sprawia, że ​​nazwa metody selektora różni się od zwykłego łańcucha, jest to, że kompilator upewnia się, że selektory są unikalne.To, co czyni selektor użytecznym, to to, że (w połączeniu ze środowiskiem wykonawczym) działa jak dynamiczny wskaźnik funkcji, który dla danej nazwy automatycznie wskazuje na implementację metody odpowiedniej dla dowolnej klasy, z którą jest używany. Załóżmy, że masz selektor do uruchomienia metody i klasy Dog, Athlete i ComputerSimulation (każda z nich zaimplementowała uruchomienie metody). Selektor może być używany z instancją każdej z klas w celu wywołania jej metody uruchamiania, nawet jeśli implementacja może być inna dla każdej z nich.