Como posso me livrar de um aviso de “variável não utilizada” no Xcode?

98

Eu entendo exatamente por que ocorrem avisos de variáveis ​​não utilizadas. Não quero suprimi-los em geral, porque eles são incrivelmente úteis na maioria dos casos. No entanto, considere o seguinte código (inventado).

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

O Xcode relata que savedé uma variável não usada, quando é claro que não é. Suspeito que seja porque NSAssert1é uma macro. A NS_BLOCK_ASSERTIONSmacro não está definida, portanto, as asserções do Objective C estão definitivamente habilitadas.

Embora não machuque nada, acho isso desarrumado e irritante, e quero suprimi-lo, mas não tenho certeza de como fazer isso. Atribuir a variável a si mesma elimina o aviso do compilador, mas prefiro fazer da maneira "certa", se tal coisa existir.

Gregory Higley
fonte

Respostas:

107

Não tenho certeza se ele ainda é compatível com o novo compilador LLVM, mas o GCC tem um atributo "não utilizado" que você pode usar para suprimir esse aviso:

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

Alternativamente (caso o LLVM não suporte o acima), você poderia dividir a declaração da variável em uma linha separada, garantindo que a variável seria "usada" independentemente da macro expandir ou não:

BOOL saved = NO;
saved = [moc save:&error];
Sherm Pendley
fonte
107

Usando o Xcode 4.3.2 e descobri que isso parece funcionar (menos escrita)

BOOL saved __unused;
JOM
fonte
Isso não funciona para mim, recebo um aviso de que'saved' was marked as unused but was used
Heath Borders
37

No Xcode você pode definir os avisos para "Variáveis ​​não utilizadas". Vá para "Build Settings" para o destino e filtre com a palavra "unused"

Aqui está uma captura de tela: Captura de tela das configurações do Builld

Eu sugiro que você apenas altere para Debug. Dessa forma, você não perderá nada em sua versão de lançamento.

Sapo preto
fonte
37
Você perdeu a parte da pergunta em que Gregory disse "Não quero suprimi-los em geral, porque eles são incrivelmente úteis na maioria dos casos"?
Sherm Pendley
8
@ShermPendley Apesar disso, ainda é útil, respondeu minha pergunta sobre como desativá-lo globalmente.
raffian
9
desativar avisos é uma ótima maneira de evitar bugs. Eu recomendo fortemente contra.
orion elenzil
2
@orionelenzil - bem, sim e não. Existe um problema real de interface com falsos positivos. O aviso aparece constantemente enquanto você está escrevendo o código, se você não tiver chegado à parte do código em que usa a variável. Com o tempo, isso o treinará para ignorar o aviso, o que significa que você pode perder erros mais importantes. Seria melhor ser capaz de suprimir o erro em blocos de código que estão sendo ativamente editados.
TechZen
Oi, está funcionando bem se eu definir NÃO. mas minha dúvida é: eu tenho que definir Debug & Release NO ya only Unused Variable: NO? qual eu tenho que definir. Se eu definir Totalmente NÃO, então não criará nenhum problema durante o lançamento na?
SR Nayak de
22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Tente assim. Está funcionando para mim. Vai funcionar para você também.

Danny Xu
fonte
Isso não funciona para mim, recebo um aviso de que'saved' was marked as unused but was used
Heath Borders
15

A única maneira simples e portátil de marcar a variável como usada é ... usá-la.

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

Você pode estar feliz com as extensões específicas do compilador já descritas, no entanto.

user3125367
fonte
2
Eu prefiro isso ao invés do feio #pragma descrito acima.
norte
1
Olá mano, boa dica
dimazava
13
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

FONTE

Alex
fonte
Esta é a abordagem mais limpa, pois desativa apenas o aviso entre aqueles #
pragmas
8

tente com: atributo __unused. Funciona no Xcode 5

João Nunes
fonte
5

Você pode definir o aviso do complilador LLVM 2.0 "Não" no "Release"insira a descrição da imagem aqui

Ar Não
fonte
4

É assim que você faz em C e, portanto, também em Objective-C.

Mesmo que você não tenha os avisos habilitados, é sempre uma boa ideia marcar o valor de retorno como explicitamente ignorado. Isso também mostra a outros desenvolvedores que você não apenas se esqueceu do valor de retorno - na verdade, optou explicitamente por ignorá-lo.

(void)[moc save:&error];

EDIT: Compiladores ignoram cast para void, então não deve afetar o desempenho - é apenas uma anotação humana limpa e agradável.

Trenskow
fonte
Em certos contextos, você DEVE usar este hack para obter o código Objective-C para compilar. Usar (void)é a maneira mais fácil de fazer, obrigado!
Dan Rosenstark
1

Faça ocupar duas linhas. Separe a declaração e o valor padrão

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
0xFADE
fonte