2010-04-20 18 views
10

Czy ktoś może mnie oświecić, jeśli chodzi o różnice między dwoma oświadczeniami poniżej.Korzystanie z [metody własnej] lub @selector (metoda)?

[self playButtonSound]; 

I:

[self performSelector:@selector(playButtonSound)]; 

ja tylko pytam jak miałem jakiś stary kod, który używany @selector, teraz trochę więcej wiedzy nie mogę myśleć, dlaczego nie skorzystać [self playButtonSound] zamiast tego oba wydają się robić to samo, co tutaj napisane.

gary

+0

Dziękuję, rozumiem teraz, bardzo docenione. – fuzzygoat

+1

Van: dlaczego usunąłeś, to jest pomocne, czyż nie? Z całą pewnością zrobią to samo. Niewielka różnica polega na tym, że pierwszym przykładem będzie wysłanie jednej wiadomości, playButtonSound; drugi będzie wysyłał dwie wiadomości, najpierw performSelector :, która następnie wyśle ​​playButtonSound. Zawsze wybieram pierwszą opcję, chyba że nie masz wyboru, czy tylko dla czytelności. – fuzzygoat

Odpowiedz

10

Zarówno do tego samego, ale [self playButtonSound]; jest zdecydowanie normalny sposób do wywołania metody w Objective-C. Jednak użycie metody performSelector: umożliwia wywołanie metody określonej tylko w środowisku wykonawczym.

Z NSObject Protocol Reference:

performSelector: metoda równoważne wysyłania aSelector komunikat bezpośrednio do odbiornika. Dla przykład, wszystkie trzy z następujących komunikatów zrobić to samo:

id myClone = [anObject copy]; 
id myClone = [anObject performSelector:@selector(copy)]; 
id myClone = [anObject performSelector:sel_getUid("copy")]; 

Jednak metoda performSelector: pozwala na wysyłanie wiadomości, które nie są określone aż starcie. zmienna selektor może być przekazany jako argumentu:

SEL myMethod = findTheAppropriateSelectorForTheCurrentSituation(); 
[anObject performSelector:myMethod]; 
+1

Natknąłem się na tę odpowiedź i nauczyłem się czegoś! Dzięki! – Groot

6
[self playButtonSound]; 

Tutaj kompilator będzie sprawdzić, czy obiekt odpowiada -playButtonSound wiadomości i daje ostrzeżenie, jeśli tak nie jest.

[self performSelector:@selector(playButtonSound)]; 

Wywołanie -playButtonSound w ten sposób nie dostaniesz ostrzeżenia kompilatora. Jednak możesz sprawdzić dynamicznie, czy obiekty odpowiadają na dany selektor - możesz więc bezpiecznie próbować wywołać arbitralny selektor na obiekcie bez określania jego typu i nie otrzymywania ostrzeżeń kompilatora (które mogą być przydatne na przykład do wywoływania metod opcjonalnych w delegacie obiektów) :

if ([self respondsToSelector:@selector(playButtonSound)]) 
    [self performSelector:@selector(playButtonSound)]; 
+0

Brakuje nawiasu w wierszu 'if ([self responsesToSelector: @selector (playButtonSound)]' -to powinno być 'if ([self responsesToSelector: @selector (playButtonSound)])'. –

+2

Właściwie możesz mieć kompilator wyślij ostrzeżenie na niezadeklarowanych selektorach, dodając opcję -Wyświetlany-selektor w polu Inne flagi ostrzegawcze w ustawieniach kompilacji. Uważam, że jest to bardzo pomocne. –

Powiązane problemy