2011-11-15 10 views
5

Come dovrei rispondere a questo avviso?: la definizione del protocollo duplicato di "..." viene ignorata

avvertimento: duplicare definizione del protocollo di '...' viene ignorato

La mia dichiarazione di protocollo è nel proprio file h, ed è # import'ed in pochi altri file nel mio progetto.

Ebbene, nel caso in cui, ecco l'intero file di intestazione con la dichiarazione protocollo:

#import <Foundation/Foundation.h> 

@class Wrapper; 

@protocol WrapperDelegate 

@required 
- (void)wrapper:(Wrapper *)wrapper didRetrieveData:(NSData *)data; 

@optional 
- (void)wrapperHasBadCredentials:(Wrapper *)wrapper; 
- (void)wrapper:(Wrapper *)wrapper didCreateResourceAtURL:(NSString *)url; 
- (void)wrapper:(Wrapper *)wrapper didFailWithError:(NSError *)error; 
- (void)wrapper:(Wrapper *)wrapper didReceiveStatusCode:(int)statusCode; 

@end 

Grazie per qualsiasi consiglio.

+7

1. Sei sicuro di "# import" e non "# includerlo" per errore? 2. Sei sicuro (vale la pena chiedere) che nient'altro nel tuo progetto usa lo stesso nome (WrapperDelegate)? –

+0

Il commento di Quixoto sembra sospettosamente come una risposta :) Ho avuto lo stesso problema in cui ho erroneamente usato #include. #import è abbastanza intelligente da evitare la duplicazione. –

risposta

5

Verificare di non avere il file di intestazione aggiunto nel progetto due volte o due file diversi che implementano entrambi il protocollo. Questo è ciò che ha causato l'avviso per me.

+4

Cosa succede se ho due classi che implementano lo stesso protocollo? entrambi ne hanno bisogno, quindi come faccio ad aggirarlo? – zach

+2

@zach (o chiunque altro con lo stesso problema) - Mi sono imbattuto in questo problema e ho postato una domanda, che ora è stata risolta [qui] (http://stackoverflow.com/questions/10001293/duplicate-protocol-definition- avvertimento-ma-i-need-multipli-di-questo-protocollo/10001416 # 10001416). – Squatch

3

Sì, ho avuto lo stesso problema. Non sono riuscito a trovare il file di intestazione duplicato nel progetto Xcode. Ma quando ho trovato il finder da Xcode ho trovato il 2 file di intestazione del protocollo nel progetto. L'eliminazione di uno ha risolto il problema. Grazie.

1

Solo per integrare le risposte esistenti qui con il problema specifico che ho incontrato.

Fondamentalmente, il compilatore non sta mentendo. Trova più di una definizione di classe, protocollo, enum, define o qualunque cosa sia presente nei file di intestazione offensivi.

L'errore potrebbe essere una combinazione dei file di intestazione e del percorso di ricerca dell'intestazione.

In un primo momento, i problemi sembrano sconcertanti poiché sappiamo che la dichiarazione #import importa solo i file che non sono già stati implementati. Pertanto, a differenza di #include, questo problema non dovrebbe verificarsi, giusto?

#import funziona. Tuttavia, se le intestazioni sono state configurate in modo errato, sebbene possa incontrare un file con lo stesso nome, ad es. MyLibrary.h, se il file esiste in due posti diversi entrambi nel percorso di ricerca dell'intestazione, Xcode li percepirà come due file diversi.

Nel mio caso, ho avuto una fase di creazione di una libreria statica che copiava le intestazioni pubbliche.

enter image description here

I prodotti dipendenti cercato la cartella sopra - definito in Impostazioni costruito come include/$(TARGET_NAME)-e la cartella di origine del mio progetto.

Ciò significava due cartelle diverse, entrambe nel percorso di ricerca dell'intestazione, che contenevano il file MyLibrary.h. Tutto in quel file causerebbe un avvertimento del compilatore duplicato o di ridefinizione o un errore del linker.

TLDR: lo stesso file può trovarsi in due cartelle diverse ed entrambi si trovano nel percorso di ricerca dell'intestazione. Controlla i tuoi percorsi e, se hai incorporato una libreria statica nel progetto o nell'area di lavoro, controlla anche dove vengono copiate le intestazioni pubbliche come parte dell'indagine.

Problemi correlati