2010-03-02 11 views
6

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

7

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).

+0

Nieformalny protokół idealnie rozwiązuje mój problem. –

4

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.

+0

Działa to tylko dla metod, które pobierają 0, 1 lub 2 typy obiektów. – bbum

+0

Rzeczywiście. Zmieniono odpowiedź, aby wyjaśnić to ograniczenie. – Guillaume

Powiązane problemy