Mam klasę, która używa resolveInstanceMethod
do dynamicznego wdrażania metod. Kiedy wywołuję dynamicznie implementowane metody z innych części kodu, kompilator wysyła ostrzeżenie, że obiekt może nie odpowiadać selektorowi. Chciałbym, aby kompilator nie emitował takich ostrzeżeń dla tej klasy, ale nie chcę tłumić ostrzeżeń, gdy wywołuję niepoprawny selektor na innych klasach. czy to możliwe?Jak mogę powiedzieć kompilatorowi, że moja klasa rozwiązuje metody dynamicznie?
Odpowiedz
Zakładając wiesz podpisy metody, które będą dynamicznie rozwiązane w czasie kompilacji, można zadeklarować „em w nieformalnym kategorii:
@interface MyDynamicallyResolvingClass(MethodsThatWillResolveAtRuntime)
... declare the methods here ...
@end
Nie ma potrzeby, aby zapewnić realizację.
Jeśli nie znasz podpisów - jeśli nazwy metod są również dynamiczne - musisz użyć albo -performSelector:
(albo pojedynczych lub podwójnych wariantów argumentów) lub prawdopodobnie będziesz chciał użyć NSInvocation, chyba że wydajność jest poważnym problemem (jeśli tak, istnieją alternatywne rozwiązania, które są znacznie bardziej skrzypiące).
Zastosowanie performSelector:
Jest to równoznaczne z wysłaniem wiadomości bezpośrednio do odbiornika, jednak pozwala na wysyłanie wiadomości, które nie zostały określone aż do czasu wykonywania.
Jeśli metody wziąć jeden lub dwa argumenty, można użyć Sióstr tej metody: – performSelector:withObject:
i – performSelector:withObject:withObject:
Jeśli metody mają więcej niż dwa argumenty, ani argumentów, które nie są od typu obiektu, ta odpowiedź jest nie przystosowany.
- 1. Jak mogę powiedzieć Emacsowi, że zmieniła się moja gałąź git?
- 2. Jak mogę powiedzieć kompilatorowi, aby nie tworzył obiektu tymczasowego?
- 3. Czy można powiedzieć kompilatorowi, że metoda zawsze generuje wyjątek
- 4. Jak mogę "powiedzieć" kompilatorowi C, że kod nie powinien być zoptymalizowany?
- 5. Co sprawia, że pylin myśli, że moja klasa jest abstrakcyjna?
- 6. Jak mogę nakazać kompilatorowi zignorowanie metody śledzenia stosu?
- 7. Czy możesz określić argument type dla None lub powiedzieć kompilatorowi, że jest to Option [String]?
- 8. Jak powiedzieć powiedzieć javadoc, że mój okres nie kończy zdanie
- 9. Jak mogę powiedzieć, że mój kod działa w trybie Mono?
- 10. Jak mogę powiedzieć, że `ConcurrentDictionary.GetOrAdd` nie dodaje wartości?
- 11. Jak mogę powiedzieć, że narzędzie testowe Perla ignoruje pewne testy?
- 12. Jak powiedzieć Google, że strona została przeniesiona?
- 13. Jak mogę dynamicznie definiować metodę aliasu dla metody klasy?
- 14. Czy mogę powiedzieć, że ggpairs używa skali logowania?
- 15. Jak mogę uzyskać resharper, aby wiedzieć, że moja zmienna nie ma wartości null, po wywołaniu metody rozszerzenia?
- 16. Jak sprawić, by moja klasa statyczna nie była tak statyczna?
- 17. Dlaczego moja klasa nie jest akceptowalna
- 18. Jak mogę dać kompilatorowi Intellijmu więcej miejsca na sterty?
- 19. Dlaczego moja klasa nie jest ładowana
- 20. Jak mogę powiedzieć, którego vim użyć?
- 21. Moja klasa AsyncTask zawiera inne wątki. Jak mogę poczekać na zakończenie wszystkich wątków przed wykonaniem poniższej metody?
- 22. Jak mogę powiedzieć angularjs do „odświeżenia”
- 23. Czy moja klasa sesji powinna być statyczna?
- 24. Jak mogę powiedzieć altówce, gdzie zainstalować pakiety?
- 25. Jak mogę dynamicznie ustawić parametr w Symfony2?
- 26. Jak dynamicznie wywoływać metody dostępu w Ruby
- 27. Czy potrzebuję metody equals i Hashcode, jeśli moja klasa implementuje porównywalną w Javie?
- 28. Jak powiedzieć eslint że wolisz apostrofów wokół struny
- 29. Jak powiedzieć JAXB, że kolejność elementów nie ma znaczenia?
- 30. Jak formalnie powiedzieć, że funkcja nie jest ścisła w argumentacji?
Nieformalny protokół idealnie rozwiązuje mój problem. –