2009-06-24 12 views
28

W moim obecnym projekcie wewnątrz ViewController.m plików Używam metody:Pokonanie „wiele metod o nazwie«xxx:»znaleziono” błąd

[[connection writer] writeData: data]; 

Zwraca ostrzeżenie:

warning: multiple methods named 'writeData:' found 

ja próbuje wywołać metodę:

- (void) writeData: (NSData*)data 

... w TCPWriter.m. Niestety, istnieją dwa inne writeData metody

- (void)writeData:(NSData *)data; 

... w NSFileHandle.h i ...

- (BOOL)writeData:(NSData *)data 

... w NSURLHandle.h. Jest to szczególnie mylące ponieważ [conn writer] powinien zwrócić klasę TCPWriter i ta klasa powinna wywołać poprawną metodę writeData. Ponadto, nie jestem nawet całkowicie pewien, że NSFileHandle.h i NSURLHandle.h są nawet zawarte w dowolnej bibliotece zawartej w ViewController.h, a nie w innej części projektu.

Jak mogę pokazać kompilatorowi, którą metodę, którą chcę wywołać, writeData i dlaczego ten błąd się pojawia?

Odpowiedz

53

Upewnij się, że [program piszący połączenia] rzeczywiście zwraca komunikat TCPWriter *. Jeśli zwraca identyfikator, to kompilator nie będzie wiedział, których danych do zapisu użyć. Upewnij się także, że importujesz plik TCPWriter.h - jeśli kompilator nie zobaczy plików nagłówkowych, domyślnie powróci do identyfikatora, co spowoduje powrót do tego samego problemu.

Spróbuj

TCPWriter* writer = [connection writer]; 
[writer writeData: data]; 

lub

[(TCPWriter*)[connection writer] writeData: data]; 
+1

Nie zdawałem sobie sprawy, że domyślnie zwrócił on identyfikator, gdy plik nie został jawnie zaimportowany. Dzięki! – Holtorf

+2

Włącz ostrzeżenia i nie musisz się zastanawiać. Inne znaczniki linkera: -Wszystkie i włączaj jak najwięcej innych, w tym Traktuj ostrzeżenia jako błędy. –

4

Jako alternatywę dla odpowiedzi wspaniałej powyżej, można rzutować obiektu do odpowiedniego typu, aby pozbyć się ostrzeżenia też tak:

Powiązane problemy