2009-09-25 10 views
12

Mam wywołanie takie jak to [metoda klasy] i ostrzeżenie, że klasa nie może odpowiedzieć na wiadomość "metoda".Jak wyłączyć ostrzeżenie w kodzie Xcode w konkretnym wierszu?

Komunikat "metoda" w rzeczywistości nie istnieje, ale mój kod używa nieznanego komunikatu przechwytującego (używając forwardingTargetForSelector), więc będzie działał dobrze i jest zbudowany, aby działał w ten sposób. Jak mogę ukryć to denerwujące ostrzeżenie?

Odpowiedz

16

Jeśli zamierzasz wysłać ewentualnie-ZAIMPLEMENTOWANE wiadomość do obiektu, a wiesz, że masz zamiar złapać awarie, należy użyć inwokację:

id myClone = [anObject performSelector:@selector(copy)]; 

który deklaruje twoje intencje bardziej bezpośrednio, że nazywasz metodę, która może nie istnieć, i jesteś z tym fajna. Jest to bardziej przejrzysty sposób, niż wytłumianie ostrzeżenia lub symulowanie metody.

+0

Dzięki. Sądzę, że byłoby to mniej wydajne, chociażbym musiał utworzyć selektor przy każdym połączeniu. Chyba że zadeklaruję wszystkie moje @selector jedno i dla wszystkich. – CodeFlakes

+1

Różnica w wydajności będzie praktycznie niewykrywalna. Jeśli się martwisz, zrób profil. Nie optymalizuj przedwcześnie. –

+2

'performSelector' działa tylko dla metod, których typami argumentów i typem powrotu są wszystkie obiekty; i którzy mają tylko 0, 1 lub 2 argumenty – user102008

3

Można zdefiniować kategorię, która deklaruje tę metodę. Posiadanie definicji w czasie kompilacji pozwoliłoby uniknąć ostrzeżenia. Coś jak

@interface MyClass (ShutUpTheCompilerMethods) 
- (void)method; 
@end 

... 

[MyClass method] //no warning here