2011-02-09 14 views
11

Antes de Xcode 4 con LLVM esto pasó el compilador desapercibido. La asignación dentro del condicional es perfectamente intencional y una expresión del cacao.if (self = [super init]) - ¡Advertencia de LLVM! ¿Cómo estás lidiando con eso?

Xcode 4 con el compilador LLVM seleccionado nunca deja de quejarse, y no solo en tiempo de compilación, tan pronto como lo escriba, aparece el icono de advertencia amarillo. Desactivar las advertencias como errores e ignorar la advertencia no parece una buena idea. Mover la asignación de los paréntesis desperdicia espacio. Tener que desactivar esta advertencia con un pragma para cada nuevo proyecto será tedioso.

¿Cómo lo afronta? ¿Cuál será la nueva expresión idiomática?

+1

Al formatear el código, "perder espacio" no es necesariamente un desperdicio. Sangrar líneas para reflejar la estructura del programa "desperdicia espacio" pero no lo haces ¿verdad? – JeremyP

+0

Perdiendo espacio en relación con el modismo de asignar/evaluar solo. Me importa mucho lo denso que se ve el código y no me preocupan las líneas adicionales cuando las cosas están más claras. –

+1

Me encanta el doble JeremyP negativo. –

Respuesta

18

Esto es en realidad una advertencia muy antigua, que estaba justo al lado de manera predeterminada con GCC y con Clang 1.6. Xcode en realidad debería darte una sugerencia sobre cómo solucionarlo, es decir, duplicar los paréntesis.

if ((self = [super init])) { ... } 

El par adicional de parens le dice al compilador que realmente tenía la intención de hacer una asignación en el condicional.

+0

Así es, simplemente asumí que sabía de qué se quejaba, así que no leí la información sobre herramientas. –

4

Sólo tiene que utilizar dos pares de paréntesis, para que quede claro que el compilador que se está asignando a propósito:

if ((self = [super init])) 
10

Si crea un método de inicio a través de las macros de texto Xcode más nuevos, se le dio cuenta de que el nuevo bendita manera de hacerlo es init:

- (id)init { 
    self = [super init]; 
    if (self) { 
     <#initializations#> 
    } 
    return self; 
} 

Esto evita la advertencia. Aunque personalmente en mi propio código, si encuentro esto, simplemente he estado aplicando el método que mostró Kevin.

¡Algo bueno saber!

+2

No estoy seguro de que pueda llamar a esto una nueva "manera bendita".Apple siempre ha sido inconsistente sobre los estilos de codificación. –

+1

No dije que los estilos anteriores ni una vez fueron bendecidos ... En informática, ninguna bendición es para siempre. Entonces quizás sea más un "encanto". –

+0

Las respuestas de Kevin y Kendall son válidas. La diferencia entre ellos es que Kendall comprueba si la inicialización de la superclase funcionó. Aaron Hillegass explica en su libro que algunos inicializadores devolverán nulo si falla la inicialización de la superclase. Tengo la impresión de que un caso así sería patológico (una falla en el tiempo de ejecución) por lo que no parece haber ningún ejemplo de reintentar la inicialización en el caso de un retorno nulo. Sin embargo, estoy fuera de mi profundidad, y solo estoy especulando sobre eso. Me encantaría ver una explicación en profundidad autorizada. –

3

Abra el navegador del proyecto y elija su proyecto. En la ventana principal que aparece, elige "Todo". En la sección "Compilador LLVM 2.0 - Advertencias", seleccione "Otros indicadores de advertencia". Agregue la marca "Wno-idiomatic-parentheses" para "Depurar" y "Liberar". Ahora limpio y recompilar. enter image description here

0

Como algunos otros han sugerido que debe agregar un conjunto adicional de paréntesis.

Estoy lejos de ser un gurú de la expresión regular así que no dude a limpiar esto pero esta búsqueda y reemplazo en Xcode fijo alrededor del 95% de mis casos:

Replace: if\s*\({1}\s*self\s*={1}(.*)\){1} 
With: if ((self =\1)) 

tener cuidado porque esto también va a encontrar si (self == ...), así que use preview y desmarque esos o corrija mi expresión regular :)

Y empiece a usar self = ...; si (uno mismo), es más limpio.

Cuestiones relacionadas