Come posso eliminare l'avviso di "variabile non utilizzata" in Xcode?


98

Capisco esattamente perché si verificano avvisi di variabili non utilizzate. Non voglio sopprimerli in generale, perché sono incredibilmente utili nella maggior parte dei casi. Tuttavia, considera il seguente codice (artificioso).

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode segnala che savedè una variabile inutilizzata, quando ovviamente non lo è. Ho il sospetto che sia perché NSAssert1è una macro. La NS_BLOCK_ASSERTIONSmacro non è definita, quindi le asserzioni Objective C sono definitivamente abilitate.

Anche se non fa male a nulla, lo trovo disordinato e fastidioso, e voglio sopprimerlo, ma non sono sicuro di come farlo. Assegnare la variabile a se stessa elimina l'avvertimento del compilatore, ma preferisco farlo nel modo "giusto" se esiste una cosa del genere.

Risposte:


107

Non sono sicuro che sia ancora supportato nel nuovo compilatore LLVM, ma GCC ha un attributo "inutilizzato" che puoi utilizzare per sopprimere l'avviso:

BOOL saved __attribute__((unused)) = [moc save:&error];

In alternativa (nel caso in cui LLVM non supporti quanto sopra), potresti dividere la dichiarazione della variabile in una riga separata, garantendo che la variabile venga "utilizzata" indipendentemente dal fatto che la macro si espanda o meno:

BOOL saved = NO;
saved = [moc save:&error];

107

Utilizzando Xcode 4.3.2 e ho scoperto che questo sembra funzionare (meno scrittura)

BOOL saved __unused;

Questo non funziona per me, ricevo un avviso che'saved' was marked as unused but was used
Heath Borders

37

In Xcode puoi impostare gli avvisi per "Variabili non utilizzate". Vai a "Impostazioni build" per il target e filtra con la parola "inutilizzato"

Ecco uno screenshot: Screenshot delle impostazioni di Builld

Ti suggerisco di cambiarlo solo per Debug. In questo modo non ti perdi nulla nella tua versione di rilascio.


37
Ti sei perso la parte della domanda in cui Gregory ha detto "Non voglio sopprimerli in generale, perché sono incredibilmente utili nella maggior parte dei casi"?
Sherm Pendley

8
@ShermPendley Indipendentemente da ciò, è ancora utile, ha risposto alla mia domanda su come disattivarlo a livello globale.
raffian

9
disattivare gli avvisi è un ottimo modo per perdere i bug. Lo consiglio vivamente.
orion elenzil

2
@orionelenzil - beh, sì e no. C'è un vero problema di interfaccia con falsi positivi. L'avviso viene visualizzato costantemente durante la scrittura del codice se non si è arrivati ​​alla parte del codice in cui si utilizza la variabile. Nel tempo, questo ti insegnerà a ignorare l'avvertimento, il che significa che potresti perdere errori più importanti. Sarebbe meglio essere in grado di sopprimere l'errore nei blocchi di codice che vengono modificati attivamente.
TechZen

Ciao, funziona bene se imposto NO. ma il mio dubbio è: devo impostare Debug e rilascio NO ya solo Variabile non utilizzata: NO? quale devo impostare. Se imposto Totalmente NO, non crea alcun problema durante il rilascio na?
SR Nayak

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Prova in questo modo. Sta funzionando per me. Funzionerà anche per te.


Questo non funziona per me, ricevo un avviso che'saved' was marked as unused but was used
Heath Borders

15

L'unico modo semplice e portatile per contrassegnare la variabile come usata è ... usarla.

BOOL saved = ...;
(void)saved; // now used

Tuttavia, potresti essere soddisfatto delle estensioni specifiche del compilatore già descritte.


2
Preferisco questo al brutto #pragma descritto sopra.
Northernman

1
Ehi fratello, bel consiglio
dimazava

14
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

FONTE


Questo è l'approccio più pulito poiché disabilita solo l'avvertimento tra quei #pragmi
cornr


5

Puoi impostare l' avviso "No" per il compliler LLVM 2.0 su "Release"inserisci qui la descrizione dell'immagine


4

Questo è il modo in cui lo fai in C e quindi anche Objective-C.

Anche se non hai gli avvisi abilitati, è sempre una buona idea contrassegnare il valore restituito come esplicitamente ignorato. Mostra anche ad altri sviluppatori che non hai solo dimenticato il valore di ritorno, ma hai scelto esplicitamente di ignorarlo.

(void)[moc save:&error];

EDIT: i compilatori ignorano i cast su void, quindi non dovrebbe influire sulle prestazioni: è solo una bella annotazione umana pulita.


In certi contesti DEVI usare questo trucco per ottenere il codice Objective-C da compilare. L'utilizzo (void)è il modo più chiaro per andare, grazie!
Dan Rosenstark

1

Fai in modo che occupi due righe. Separare la dichiarazione e il valore predefinito

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.