Odpowiedzi:
Istnieją również statyczne instancje wiadomościRespondToSelector : (SEL) selector Można to nazwać tak:
[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]
lub tak:
[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]
Może to być przydatne, jeśli chciałbyś wywołać jednego konstruktora lub innego w zależności od tego (mam na myśli, zanim będziesz mieć samą instancję).
Użyj respondsToSelector:
. Z dokumentacji :
respondsToSelector:
Zwraca wartość logiczną wskazującą, czy odbiorca implementuje, czy dziedziczy metodę, która może odpowiedzieć na określony komunikat.
- (BOOL)respondsToSelector:(SEL)aSelector
Parametry
aSelector - selektor identyfikujący wiadomość.Wartość zwracana ,
YES
jeśli odbiorca implementuje lub dziedziczy metodę, która w przeciwnym razie może odpowiedzieć na element aSelectorNO
.
Szukasz odpowiedziToSelector: -
if ([foo respondsToSelector: @selector(bar)] {
[foo bar];
}
Jak mówi Donal, powyższe mówi ci, że foo zdecydowanie poradzi sobie z otrzymaniem selektora paska. Jednakże, jeśli foo jest proxy, które przekazuje bar do jakiegoś bazowego obiektu, który otrzyma komunikat bar, to respondsToSelector: powie Ci NIE, nawet jeśli wiadomość zostanie przekazana do obiektu, który odpowiada na bar.
Sprawdzanie selektorów za pomocą respondsToSelector jest zwykle tylko dla metod delegata. Nie należy używać forwardInvocation ani serwerów proxy dla metod delegatów. Jeśli potrzebujesz użyć respondsToSelector w innych sytuacjach, możesz upewnić się, że nie ma bardziej odpowiedniego sposobu projektowania programu.
- forwardInvocation:
).