2012-07-20 9 views
14

Jedyną różnicą, którą zaobserwowałem samemu, jest to, że odbiornik respondsToSelector może być klasą lub instancją, podczas gdy instancesRespondToSelector może mieć tylko odbiornik klasy. Co jednak sprawia, że ​​są inne? Czy są jakieś problemy z wydajnością z jednym lub drugim?Jaka jest różnica między instancjamiRespondToSelector i respondsToSelector w Objective-C?

+0

odpowiedz Odbiornik ToSelector może być tylko obiektem instancji. instancesRespondToSelector może być tylko obiektem klasy. + Lub - robi różnicę w rodzaju metody – Karthick

Odpowiedz

24

Pod maską -[NSObject respondsToSelector:] jest realizowany tak:

- (BOOL)respondsToSelector:(SEL)aSelector { 
    return class_respondsToSelector([self class], aSelector); 
} 

i +[Class instancesRespondToSelector:] jest realizowany tak:

+ (BOOL)instancesRespondToSelector:(SEL)aSelector { 
    return class_respondsToSelector(self, aSelector); 
} 

(Użyłem Hopper na CoreFoundation, aby to zrozumieć.)

Tak więc, w zasadzie nie ma różnicy. Można jednak zastąpić klasę respondsToSelector: w swojej własnej klasie, aby zwracać TAK lub NIE w zależności od instancji (NSProxy to robi). Nie możesz tego zrobić z instancesRespondToSelector:.

+2

Mała uwaga, 'instancesRespondToSelector:' ** can ** (i ** must **, jeśli implementujesz mechanizm przekazywania wiadomości), należy zastąpić. Zobacz [Przewodnik programowania w środowisku Objective-C, sekcja Przekazywanie i dziedziczenie] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html) – Lexandr

+0

@rob_mayoff Zupełnie wiem co tu mówisz, ale tylko mały punkt: w twoim pierwszym stwierdzeniu masz [NSObject odpowiadaToSelektor:], ale NSObject sam w sobie jest nazwą klasy, więc jest nieco zdezorientowany. Miałeś na myśli NSObjectInstance, prawda? – pnizzle

+0

Powszechnie jest pisać '- [NSObject respondsToSelector:]' podczas odwoływania się do wiadomości instancji zdefiniowanej przez klasę 'NSObject' (to jest wiadomość, która może być wysłana do dowolnej instancji' NSObject' lub jej podklas). Piszemy '+ [NSObject instancesRespondToSelector:]', aby odnieść się do komunikatu klasy zdefiniowanego przez klasę 'NSObject'. –

9

Jedną z różnic jest respondsToSelector nie może powiedzieć, czy instancja dziedziczy metody z nadklasy, więc jeśli chcesz coś zrobić jak [super respondsToSelector:_cmd]; to przyzwyczajenie praca, aby prawidłowo [[self superclass] instancesRespondToSelector:_cmd];

+0

Hm, okay. Ale czy nie jest to coś więcej z powodu semantyki dziedziczenia Objective-C, czyż nie różnica między tymi dwiema metodami? Ponieważ, jeśli się nie mylę, na podstawie twojego przykładu, [[superklasa własna] odpowie: ToSelektor: _cmd]; "zadziała. –

+0

nie, ponieważ nie ma metody na klasie o nazwie respondsToSelector :. responsesToSelector jest częścią protokołu NSObject, którego klasa nie jest zgodna z – wattson12

+0

@ wattson12 'NSObject' i jego podklasy odpowiadają na metodę klasy' + respondsToSelector: '. –

4

respondsToSelector: jest przykład sposób i określa, czy obiekt, który może być przykładem klasy lub obiektu klasy odpowiada selektora. Podczas przekazywania instancji testowanej dla metody instancji podczas przechodzenia obiektu klasy testujesz metodę klasy.

instancesRespondToSelector: to metoda klasy klasy i określa, czy instancje klasy odpowiadają na selektor. Umożliwia testowanie dla metody instancji danej klasy i bez z instancją tej klasy.

Powiązane problemy