Come posso sbarazzarmi di un avviso "inutilizzato variabile" in Xcode?
-
12-11-2019 - |
Domanda
Capisco esattamente perché si verificano avvisi variabili inutilizzati.Non voglio sopprimerli in generale, perché sono incredibilmente utili nella maggior parte dei casi.Tuttavia, prendere in considerazione il seguente codice (escogitato).
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
.
XCode segnala che saved
è una variabile non utilizzata, quando ovviamente non lo è.Sospetto che questo sia perché NSAssert1
è una macro.La macro NS_BLOCK_ASSERTIONS
è non definita, quindi gli obiettivi C Assertions sono definitivamente abilitati.
Mentre non fa male a nulla, lo trovo disordinato e fastidioso, e voglio sopprimerlo, ma non sono sicuro di come farlo.L'assegnazione della variabile si è liberata del completamento del compilatore, ma preferirei farlo il modo "giusto" se esiste una cosa del genere.
Soluzione
Non sono sicuro se è ancora supportato nel nuovo compilatore LLVM, ma GCC ha un attributo "non utilizzato" che puoi usare per sopprimere tale avviso:
BOOL saved __attribute__((unused)) = [moc save:&error];
.
In alternativa (nel caso in cui Llvm non supporta quanto sopra), è possibile dividere la dichiarazione variabile in una riga separata, garantendo che la variabile sarebbe "utilizzata" se la macro si espande o meno:
BOOL saved = NO;
saved = [moc save:&error];
. Altri suggerimenti
Usando XCode 4.3.2 e scoperto che questo sembra funzionare (meno scrittura)
BOOL saved __unused;
. In XCode è possibile impostare gli avvisi per "Variabili non utilizzate".Vai a "Impostazioni di creazione" per il bersaglio e filtrare con la parola "non utilizzata"
Ecco uno screenshot:
Ti suggerisco di cambiarlo solo per il debug.In questo modo non ti manca nulla nella tua versione di rilascio.
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)
.
Prova così. Sta lavorando per me.Lavorerà anche per te.
L'unico modo semplice e portatile per contrassegnare la variabile come usato è ... Usarlo.
BOOL saved = ...;
(void)saved; // now used
.
Potresti essere felice con le estensioni specifiche del compilatore già descritte, però.
try with: __unused attribute. Works in Xcode 5
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop
You can set "No" LLVM compliler 2.0 warning on "Release"
This is the way you do it in C and therefore also Objective-C.
Even though you do not have warnings enabled, it's always a good idea to mark the return value as explicitly ignored. It also goes to show other developers, that you have not just forgotten about the return value – you have indeed explicitly chosen to ignore it.
(void)[moc save:&error];
EDIT: Compilers ignore casts to void
, so it should not affect performance – it's just a nice clean human annotation.
Make it take up two lines. Separate the declaration and default value
BOOL enabled = NO;
// ...
BOOL enabled;
enabled = NO;