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.

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];

107

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

BOOL saved __unused;

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.


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.


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.


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


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


5

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


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.


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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.