2010-04-12 13 views
117

Con tutti gli SDK a rotazione, è utile essere in grado di creare per più SDK e piattaforme. Tuttavia, rimbalzando 3,2-3,0 e anche occasionalmente 2.x, mi capita spesso di ricevere avvertimenti obsolete che coinvolgono i metodi che sono stati modificati o sono stati sostituiti:Soppressione di avvisi obsoleti in Xcode

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated. 

Dal momento che ho ancora voglia di mantenere la compatibilità con sistemi operativi meno recenti, e sono cercando anche di rimuovere il "rumore" durante la costruzione, c'è un modo per disattivare o disabilitare questi avvisi?

+3

Mentre la risposta di Paolo R funziona, considerare che manicaesar è un po 'più chirurgica, in quanto consente di sopprimere esattamente l'avviso che si desidera, senza perdere le altre avvertenze supplementari che potrebbero essere importanti. Mi sembra che, in termini di best practice, Sleeveesar abbia The Correct Answer ™ – Olie

risposta

67

Provare -Wno-deprecated-declarations o l'impostazione corrispondente in Xcode, GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS (consiglio pro: basta digitare "deprecato" nelle impostazioni di generazione per trovare l'impostazione specifica per questo avviso).

Le attuali versioni di Xcode (ad esempio, Xcode 9.2): le versioni

enter image description here


antichi di Xcode (ad esempio Xcode 2.x, 3.x):

enter image description here

+17

Si scopre che è ancora più semplice di così; c'è una casella nelle impostazioni del target Xcode; la tua risposta mi ha spinto a cercare lì. Grazie! –

+2

È inoltre possibile eseguire questa operazione in base al file. Vedi questa risposta per aggiungere flag per file: http://stackoverflow.com/a/6658549/272473 – mrwalker

+4

risposte come questa sono frustranti per i newb. Provalo dove? Come posso trovare le impostazioni di destinazione? Un po 'più di spiegazione aumenterebbe il valore di questa risposta. – noogrub

25

È anche possibile eliminare gli avvisi per file utilizzando

#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 

che, a sua volta, rende un po 'più pratica la semplice soppressione di tutti gli avvisi una volta e insieme ... dopotutto hai capito per che cosa lo stai facendo.

+0

Suvviato ... ha funzionato come un fascino – NSPratik

300

Poiché non riesco ancora ad aggiungere un commento al post @samiq, penso che lo espanderò. Immettere la direttiva citata prima di una funzione/metodo in cui si utilizzano elementi deprecati. Quindi è possibile ripristinare l'impostazione precedente dopo la definizione della fine funzione di:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
- (void) methodUsingDeprecatedStuff { 
    //use deprecated stuff 
} 
#pragma GCC diagnostic pop 
+1

Eccellente! Questo è quello che stavo cercando +1 :) –

+1

Suggerimento eccezionale! Peccato che non possa essere dichiarato all'interno di un metodo. – Dustin

+12

In realtà può essere dichiarato all'interno di un metodo. Ho dovuto farlo oggi a causa di un bug nel docs/sdk – jer

131

Clang fornisce una bella caratteristica che rende il "ripristino" step nel post @manicaesar indipendente dalla iniziale stato di avviso:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
- (void) methodUsingDeprecatedStuff { 
    //use deprecated stuff 
} 
#pragma clang diagnostic pop 

per citare il Clang manual:

In aggiunta a tutte le funzionalità fornite da pragma di GCC, Clang permette anche di push e pop l'avviso corrente stato. Ciò è particolarmente utile quando si scrive un file di intestazione che verrà compilato da altre persone, perché non si conoscono i flag di avviso con cui vengono creati.

+1

Le versioni più recenti di GCC utilizzano la stessa sintassi (sostituto clang per GCC). – Niclas

+2

Sono sempre confuso su ciò che è LLVM, GCC e Clang. Quindi, volevo lasciare una nota per risparmiare tempo. GNU Complier Collection (GCC) è stato utilizzato con Xcode 3, quindi Apple ha rilasciato Xcode 4 con un ibrido LLVM-GCC. Quindi il compilatore LLVM (Low Level Virtual Machine) ha preso il sopravvento, vedere maggiori informazioni su http://llvm.org. A partire da Xcode 7.2.1 il compilatore predefinito è Apple LLVM 7.0. Il compilatore LLVM è una libreria di altri "progetti", debugger e altri strumenti, che includono il compilatore nativo di Clang. Clang è un compilatore C/C++/Objective-C "nativo LLVM". –

-2

di disabilitare gli avvisi da file di intestazione di terze parti, aggiungere seguente riga nella parte superiore del file di

#pragma clang system_header 
36

Dal momento che si tende ad avere bisogno di supportare sistemi operativi meno recenti, ma prestare attenzione ai nostri avvertimenti, ho voluto un modo più ordinato per farlo.Ho messo questo insieme, ispirato da un certo codice di Mozilla:

#define SILENCE_DEPRECATION(expr)         \ 
do {                \ 
_Pragma("clang diagnostic push")         \ 
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ 
expr;                \ 
_Pragma("clang diagnostic pop")          \ 
} while(0) 

#define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr) 
#define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr) 

Questo vi permette di effettuare le seguenti operazioni:

SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]); 

Funziona anche con blocchi di codice:

SILENCE_IOS7_DEPRECATION(
    view = [[MKPolylineView alloc] initWithPolyline:self]; 
    view.lineWidth = self.lineWidth; 
    view.strokeColor = self.color; 
); 

Inoltre, quando si rilascia il supporto per dispositivi pre-iOS 7, è possibile cercare facilmente attraverso il codice per trovare gli usi deprecati da correggere.

+0

questa è una soluzione a lungo termine molto migliore per la maggior parte del codice rispetto al blocco su avvisi di deprecazione (o qualsiasi altro) a livello globale/di progetto. risposta formidabile. – natbro

+0

Questo è un modo molto sexy per risolvere questo problema comune. Apprezzo i tuoi sforzi. –

+0

Proprio come riferimento, questo può essere usato per qualsiasi opzione di clang ...Personalmente lo uso per questo ('-Wdeprecated-declarations') e per disabilitare l'avviso di perdite performSelector (' -WperformSelector-leaks'). Hai solo bisogno di cambiare l'opzione nella seconda chiamata '_Pragma' di conseguenza. –

5

Nelle impostazioni di generazione, trovare Deprecated Functions.

enter image description here