2012-02-09 19 views
5

È buona norma inizializzare la variabile su nil?È buona norma inizializzare una variabile su zero?

Lo chiedo perché, quando eseguo l'analizzatore sul mio progetto, ricevo un avviso.

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 

Quando cambio il codice l'avvertimento è andato:

NSString *q = nil; 
+1

Si noti che il compilatore dovrebbe lamentarsi rumorosamente di quel modello. Un'idea migliore è non reinventare la ruota usando direttamente l'API sqlite; ci sono entrambi wrapper di terze parti che ti offrono API di livello superiore che renderanno lo sviluppo più veloce o che potresti utilizzare Core Data, che ti offrirà un'integrazione molto migliore con il sistema nel suo complesso. – bbum

+0

Grazie per il commento bbum. Hai assolutamente ragione. – objlv

risposta

11

Se si utilizza ARC, i puntatori verranno assegnati automaticamente a zero. Tuttavia, non credo che tu stia usando ARC nel qual caso il puntatore avrà un valore spazzatura. Questo è pericoloso perché chiunque abbia chiamato la funzione potrebbe ricevere il risultato e credere che il puntatore punta a qualcosa di valido poiché non è uguale a zero.

Quindi ... Sì, inizializzare sempre i puntatori su zero o un valore valido.

Esempio 1 :: Buon esempio in cui l'assegnazione a zero prima non è neccessary: ​​

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

Esempio 2 :: inappropriato esempio in cui l'assegnazione a zero prima è non necessario:

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

Esempio 3 :: Buon esempio di assegnazione a zero poiché sarà c onditionally ottenere un nuovo valore

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

Sì che è perfettamente bene. Nil è solo un altro modo di dire che questa variabile non punta a nulla in memoria.

5

Sì. Se q non è inizializzato su zero, avrà un valore casuale, che potrebbe introdurre bug nascosti nell'esecuzione successiva.

+0

Non vedo perché un valore zero è meno incline a un bug di un valore casuale. –

+0

@infact Ad esempio, se il valore restituito viene utilizzato in un blocco in un secondo momento o mantenuto da un'altra istanza, si bloccherà. – ZelluX

+0

Ho pensato di averlo modificato in iOS 5 per inizializzare automaticamente le variabili su zero. –

0

E 'una buona praticaper impostare qualsiasi variabile a un valore definito prima di essere utilizzato. Non farlo causerà tutti i tipi di problemi. Il resto dipende molto dagli strumenti che stai usando.

Un buon compilatore ti dirà se stai usando una variabile che non è stata definita prima di usarla o dove il compilatore non può dimostrare che è stata definita prima di usarla. Un cattivo compilatore (o un buon compilatore usato da uno sviluppatore che non sa come usare correttamente i suoi strumenti) non lo farà. Con un buon compilatore, l'inizializzazione su nullo o NULL potrebbe impedire al compilatore di svolgere correttamente il proprio lavoro. Considerate questo esempio, dove si vuole veramente il codice per restituire un NSString che non è pari a zero, ma non farlo bene:

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

Qui il compilatore può avvertire, perché si potrebbe restituire un risultato indefinito. Se inizializzi il risultato su zero, hai ancora lo stesso problema che potresti restituire nil in una funzione che non dovrebbe restituire nulla, ma il compilatore non può avvisarti.

D'altro canto, se il valore deve essere nullo, o se nullo è un valore accettabile, e si prevede di non impostare la variabile su un valore diverso in alcuni casi, poi inizializzazione a zero è soddisfacente e buona pratica.

Riepilogo: utilizzare un compilatore e configurarlo correttamente in modo che indichi se si stanno utilizzando variabili non inizializzate. Se ricevi un avviso sulle variabili non inizializzate, correggi il problema, non l'avviso.

Problemi correlati