2012-02-09 14 views
5

¿Es una buena práctica inicializar la variable a nil?¿Es una buena práctica inicializar una variable a nulo?

Lo pregunto porque cuando ejecuto el analizador en mi proyecto recibo una advertencia.

NSString *q; 

    if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) 
    { 
     sqlite3_step(statement); 
     selectedQuestion =[NSString stringWithFormat: @"%s",(char *)sqlite3_column_text(statement, 0)]; 
     sqlite3_finalize(statement); 
    } 

    sqlite3_close(database); 

    return q; //Undefined or garbage value returned to caller 

Cuando cambio el código de la advertencia se ha ido:

NSString *q = nil; 
+1

Tenga en cuenta que el compilador debe quejarse en voz alta sobre ese patrón. Una mejor idea es no reinventar la rueda mediante el uso de la API sqlite directamente; hay envolturas de terceros que le brindan API de mayor nivel que harán que el desarrollo sea más rápido o podría usar Core Data, que le proporcionará una mejor integración con el sistema en general. – bbum

+0

Gracias por el comentario bbum. Tienes toda la razón. – objlv

Respuesta

11

Si está utilizando ARC, sus punteros se asignarán automáticamente a nil. Sin embargo, no creo que esté utilizando ARC, en cuyo caso el puntero tendrá un valor de basura. Esto es peligroso porque quien llamó a la función podría recibir el resultado y creer que el puntero apunta a algo válido ya que no es igual a cero.

Entonces ... Sí, siempre inicialice sus punteros a cero o un valor válido.

Ejemplo 1 :: Buen ejemplo en el que la asignación a cero no es la primera neccessary: ​​

UIViewController *myVC = [[[UIViewController] alloc] init] autorelease]; 

Ejemplo 2 :: Mal ejemplo, donde la asignación a cero materna no es el neccessary: ​​

UIViewController *myVC = nil; // dumb since next line assigns it to valid value 
myVC = [[[UIViewController] alloc] init] autorelease]; 

Ejemplo 3 :: Buen ejemplo de asignación a nil ya que c onditionally obtener un nuevo valor

UIViewController *myVC = nil; // :D 
if (someCondition) 
{ 
    myVC = [[[UIViewController] alloc] init] autorelease]; 
} 
... 
0

Sí eso es perfectamente bien. Nada más que otra forma de decir que esta variable no apunta a nada en la memoria.

5

Sí. Si q no se inicializa a cero, tendrá un valor aleatorio, lo que puede introducir errores ocultos en la ejecución posterior.

+0

No veo por qué un valor cero es menos propenso a errores que un valor aleatorio. –

+0

@infact Por ejemplo, si el valor devuelto se usa en un bloque más tarde o lo retiene alguna otra instancia, se bloqueará. – ZelluX

+0

Pensé que habían cambiado esto en iOS 5 para inicializar automáticamente las variables a cero. –

0

Es una muy buena prácticapara establecer cualquier variable a un valor definido antes de ser usado. No hacerlo va a causar todo tipo de problemas. El resto depende mucho de las herramientas que estás usando.

Un buen compilador le dirá si está utilizando una variable que no se ha definido antes de usarla o si el compilador no puede demostrar que está definida antes de usarla. Un compilador incorrecto (o un buen compilador utilizado por un desarrollador que no sabe cómo usar sus herramientas correctamente) no hará eso. Con un buen compilador, la inicialización a cero o NULL podría evitar que el compilador haga su trabajo correctamente. Considere este ejemplo, donde realmente se desea que el código para devolver un NSString que no es nula, pero no lo hacen bien:

NSString* result; 
if (condition) result = @"True"; 
else if (otherCondition) result = @"False"; 
return result; 

Aquí el compilador puede advertir que, ya que podría devolver un resultado indefinido. Si inicia el resultado en nulo, todavía tiene el mismo problema que puede devolver cero en una función que no se supondrá que devuelva nada, pero el compilador no puede advertirle.

Por otro lado, si el valor debe ser nulo, o cuando fuera nulo es un valor aceptable, y no vaya a establecer la variable a un valor diferente en algunos casos, a continuación, inicializar a cero está bien y bueno práctica.

Resumen: utilice un compilador y configúrelo correctamente para que le diga si está utilizando variables sin inicializar. Si recibe una advertencia sobre variables no inicializadas, solucione el problema, no la advertencia.

Cuestiones relacionadas