2010-07-24 24 views

Respuesta

7

Para ampliar @Anders comentario, la cuestión específica que se está protegiendo contra es la siguiente:

if (foo = x) { do_something() }; 

90% de las veces esto es un error. Querías decir foo == x. Pero el 10% de las veces, realmente quiso decir "asignar x a foo y luego probar la verdad". El caso canónico de esto es while (ch = getchar()). Pero el if (self = [super init]) es otro buen ejemplo. El compilador asume que tales cosas son errores y arroja una advertencia a menos que le digas al compilador que realmente lo significaste mediante el doble paréntesis.

Personalmente, acabo de hacerlo de esta manera:

self = [super init]; 
if (self != nil) 
{ 
    ... 
} 
return self; 

Es una línea adicional, pero que mantiene las cosas simplemente ese poquito más claras cuando la llamada init es larga.

Como un aparte, la fama de Aaron Hillegass de Big Nerd Ranch desafió a varios de nosotros a encontrar cualquier caso en el que este cheque self==nil importara realmente. Los casos existen, pero son increíblemente pocos (puede agregar self como observador NSObservation y no desea que sea nil en ese caso). Tomalo por lo que vale; en mi código personal a menudo omito el cheque nil, pero en mi código profesional es parte del estándar de mi equipo.

Como otro lado, por alguna razón Apple agregó una opción adicional de gcc -Wmost que desactiva esta advertencia. Supongo que a alguien allí no le gustaba escribir los paréntesis adicionales. Me parece una mala idea apagarlo.

2

es solo para evitar recibir una advertencia.

+0

y afortunadamente (modernos) compiladores emiten advertencias. muchos errores se pueden introducir al usar accidentalmente una asignación vs. igualdad en la expresión condicional; estos no deben ignorarse trivialmente. –

+0

sí, en objc cuando hay una advertencia de que podría ser algo realmente serio, así que deshacerse de algunos triviales hace que sea más fácil detectar los desagradables. –

Cuestiones relacionadas