2009-08-11 4 views
3

Dites que je veux créer une instance de NSString, qui est initialisée à une certaine valeur en fonction de la valeur d'une autre variable. Normalement, je feraisLors de la déclaration d'objets dans Cocoa, devrais-je les mettre à zéro?

NSString *string; 
if(foo == 1) 
    string = @"Foo is one."; 
else 
    string = @"Foo is not one."; 

Cependant, dans un exemple de code que je l'ai vu, je l'ai vu des gens faire

NSString *string = nil; 
if(foo == 1) 
    string = @"Foo is one."; 
else 
    string = @"Foo is not one."; 

Quelle est la différence entre ces deux, et la méthode est préférée ?

Répondre

6

Ma préférence personnelle est d'initialiser toute variable immédiatement. Cependant, dans l'échantillon que vous avez fourni, ces deux méthodes sont équivalentes.

En C langues (à savoir C, C++, Obj-C) variables qui ne sont pas initialisés peuvent immédiatement contenir des valeurs de déchets aléatoires. L'utilisation de la variable avant son initialisation conduit à un comportement inattendu (allant de l'effondrement avec espoir à un comportement inattendu).

Exemple Prenons l'exemple suivant:

int abs; 
if (argument > 0) abs = argument; 
else if (argument < 0) abs = -1 * argument; 
NSLog(@"%i", abs); 

Voici le code laisse abs variable non initialisée si argument est 0. Donc, vous obtenir des valeurs aléatoires enregistrées et conduisent à corrompre les valeurs dans le reste de le programme; et il serait difficile de détecter où est le problème! Si vous utilisez une référence non initialisée, vous obtiendrez probablement un EXC_BAD_ACCESS.

1

La définition de variables à une valeur ou à zéro peut faciliter la détection d'une erreur de valeur non initialisée lors de l'exécution.

NSString *string = @"Foo is not one"; 
if(foo == 1) 
    string = @"Foo is one."; 

Différents compilateurs sont meilleurs pour détecter des valeurs non initialisées ces jours-ci. Une raison Objective C pour définir des pointeurs à zéro (après la dernière utilisation) est garbage collection.

0

En règle générale, vous définissez probablement une variable à zéro pour vous assurer que vous démarrez avec un état de valeur connu de la variable. Vous savez donc que la variable est nulle et que plus tard vous pouvez comparer la variable contre zéro. Un bon exemple est l'erreur de vérification avec NSError comme si

NSError *error = nil; 
[SomeCocoaClass performOperationWithObject:obj error:&error]; 
if(nil != error){ 
//handle error 
} 

Il est possible de créer une variable et commencer avec un état non initialisé et puis quand vous essayez de lire cette variable en vous obtenez plus tard déchets et accident. C'est juste une bonne pratique de codage pour initialiser vos variables à un état initial connu puis vérifier plus tard par rapport à cet état.

2

L'affectation à zéro est là pour que personne ne regarde jamais le code et s'inquiète que la variable est jamais dans un état indéfini. Ce code affichera une valeur erronée car la valeur de la chaîne est indéfinie.

Plutôt que d'écrire du code comme dans votre exemple, je préfère utiliser l'opérateur ternary.Voici un exemple:

NSString *string = (foo == 1) ? @"Foo is one." : @"Foo is not one."; 

La valeur de la chaîne est toujours définie. Si les expressions se compliquent et que la ligne devient longue, utilisez simplement des variables intermédiaires.

La meilleure solution à de nombreux problèmes consiste simplement à éliminer le problème. Cela fait juste cela.

Questions connexes