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?
Odpowiedz
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:
.
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
@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
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'. –
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];
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. –
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
@ wattson12 'NSObject' i jego podklasy odpowiadają na metodę klasy' + respondsToSelector: '. –
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.
- 1. Jaka jest różnica między? : i ||
- 2. Jaka jest różnica między $ i $$?
- 3. Jaka jest różnica między = i: = w mysql?
- 4. Jaka jest różnica między! = I =! w Javie?
- 5. Jaka jest różnica między 'i "w PHP
- 6. Jaka jest różnica między! i !! w yaml?
- 7. jaka jest różnica między @ i @@ w module?
- 8. Jaka jest różnica między * i. * W Matlab?
- 9. Jaka jest różnica między | i || w MATLAB?
- 10. Jaka jest różnica między * i * | * w CSS?
- 11. Jaka jest różnica między System.Windows.Controls.Control i System.Windows.Forms.Control?
- 12. Jaka jest różnica między asersem i static_assert?
- 13. Jaka jest różnica między PropertyChangeListener i VetoableChangeListener?
- 14. Jaka jest różnica między Ja i Ja?
- 15. Jaka jest różnica między ATL i WTL?
- 16. Jaka jest różnica między FontMetrics.stringWidth() i FontMetrics.getStringBounds()?
- 17. Jaka jest różnica między "CompletionStage" i "CompletableFuture"?
- 18. Jaka jest różnica między CellClick i CellMouseClick?
- 19. Jaka jest różnica między ObjectResult i JsonResult
- 20. Jaka jest różnica między ssize_t i ptrdiff_t?
- 21. Jaka jest różnica między fn i fn *?
- 22. Jaka jest różnica między getMeasuredHeight i getHeight
- 23. Jaka jest różnica między beginTrackingWithTouch i touchBegan?
- 24. Jaka jest różnica między init() i window.init()?
- 25. Jaka jest różnica między WCF i WPF?
- 26. Jaka jest różnica między SQLite i SQL
- 27. Jaka jest różnica między tf.Session() i tf.InteractiveSession()?
- 28. Jaka jest różnica między sysfs_create_file() i sysfs_create_group()?
- 29. jaka jest różnica między installshield i windowsinstaller
- 30. Jaka jest różnica między developer.paypal.com i x.com?
odpowiedz Odbiornik ToSelector może być tylko obiektem instancji. instancesRespondToSelector może być tylko obiektem klasy. + Lub - robi różnicę w rodzaju metody – Karthick