¿Cómo puedo deshacerme de una advertencia de "variable no utilizada" en Xcode?

98

Entiendo exactamente por qué ocurren las advertencias de variables no utilizadas. No quiero suprimirlos en general, porque son increíblemente útiles en la mayoría de los casos. Sin embargo, considere el siguiente código (artificial).

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

Xcode informa que savedes una variable no utilizada, cuando por supuesto que no lo es. Sospecho que esto se debe a que NSAssert1es una macro. La NS_BLOCK_ASSERTIONSmacro no está definida, por lo que las afirmaciones de Objective C definitivamente están habilitadas.

Si bien no duele nada, lo encuentro desordenado y molesto, y quiero suprimirlo, pero no estoy seguro de cómo hacerlo. Asignarse la variable a sí misma elimina la advertencia del compilador, pero prefiero hacerlo de la manera "correcta" si existe tal cosa.

Gregory Higley
fuente

Respuestas:

107

No estoy seguro de si todavía es compatible con el nuevo compilador LLVM, pero GCC tiene un atributo "no utilizado" que puede usar para suprimir esa advertencia:

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

Alternativamente (en caso de que LLVM no admita lo anterior), puede dividir la declaración de la variable en una línea separada, garantizando que la variable se "usará" si la macro se expande o no:

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

Usando Xcode 4.3.2 y descubrí que esto parece funcionar (menos escritura)

BOOL saved __unused;
JOM
fuente
Esto no funciona para mí, recibo una advertencia de que'saved' was marked as unused but was used
Heath Borders
37

En Xcode puede configurar las advertencias para "Variables no utilizadas". Vaya a "Configuración de compilación" para el destino y filtre con la palabra "no utilizado"

Aquí hay una captura de pantalla: Captura de pantalla de configuración de Builld

Te sugiero que solo lo cambies por Debug. De esa manera, no se perderá nada en su versión de lanzamiento.

Rana negra
fuente
37
¿Se perdió la parte de la pregunta en la que Gregory dijo: "No quiero suprimirlos en general, porque son increíblemente útiles en la mayoría de los casos"?
Sherm Pendley
8
@ShermPendley Independientemente, esto sigue siendo útil, respondió a mi pregunta sobre cómo apagarlo globalmente.
raffian
9
desactivar las advertencias es una excelente manera de evitar errores. Recomiendo encarecidamente que no.
orion elenzil
2
@orionelenzil - bueno, sí y no. Existe un problema de interfaz real con falsos positivos. La advertencia aparece constantemente mientras escribe código si no ha llegado a la parte del código donde usa la variable. Con el tiempo, esto lo capacitará para ignorar la advertencia, lo que significa que puede pasar por alto errores más importantes. Sería mejor poder suprimir el error en bloques de código que se están editando activamente.
TechZen
Hola, funciona bien si configuro NO. pero mi duda es: tengo que configurar Debug & Release NO ya solo Variable sin usar: NO? cuál tengo que configurar. Si configuro Totally NO, ¿no crea ningún problema durante el lanzamiento na?
SR Nayak
22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

Intenta así. Me está funcionando. También funcionará para ti.

Danny Xu
fuente
Esto no funciona para mí, recibo una advertencia de que'saved' was marked as unused but was used
Heath Borders
15

La única forma sencilla y portátil de marcar una variable como utilizada es ... utilizarla.

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

Sin embargo, es posible que esté satisfecho con las extensiones específicas del compilador ya descritas.

usuario3125367
fuente
2
Prefiero esto al feo #pragma descrito anteriormente.
Northernman
1
Hola hermano, buen consejo
dimazava
13
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

FUENTE

Alex
fuente
Este es el enfoque más limpio, ya que deshabilita solo la advertencia entre esos #pragmas
cornr
8

intente con: atributo __unused. Funciona en Xcode 5

João Nunes
fuente
5

Puede configurar "No" la advertencia del compliler 2.0 LLVM en "Release"ingrese la descripción de la imagen aquí

Ar No
fuente
4

Esta es la forma en que lo haces en C y, por lo tanto, también en Objective-C.

Aunque no tenga habilitadas las advertencias, siempre es una buena idea marcar el valor de retorno como explícitamente ignorado. También demuestra a otros desarrolladores que no solo se ha olvidado del valor de retorno, sino que ha elegido explícitamente ignorarlo.

(void)[moc save:&error];

EDITAR: Los compiladores ignoran las conversiones void, por lo que no debería afectar el rendimiento, es solo una buena anotación humana limpia.

Trenskow
fuente
En ciertos contextos, DEBE usar este truco para que el código Objective-C se compile. Usar (void)es la forma más clara de hacerlo, ¡gracias!
Dan Rosenstark
1

Haz que ocupe dos líneas. Separe la declaración y el valor predeterminado

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
0xFADE
fuente