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.

È stato utile?

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: BULLD Impostazioni 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

SOURCE

You can set "No" LLVM compliler 2.0 warning on "Release" enter image description here

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top