Est-il nécessaire d'assigner une chaîne à une variable avant de la comparer à une autre?

85

Je veux comparer la valeur de an NSStringà la chaîne "Wrong". Voici mon code:

NSString *wrongTxt = [[NSString alloc] initWithFormat:@"Wrong"];
if( [statusString isEqualToString:wrongTxt] ){
     doSomething;
}

Dois-je vraiment créer une NSString pour "Wrong"?

De plus, je peux comparer la valeur d'un UILabel« s textà une chaîne sans affecter la valeur d'étiquette à une chaîne?

Bryan
la source
Au fait, vous perdez du temps avec initWithFormat, vous pouvez changer NSString * falseTxt = [[NSString alloc] initWithFormat: @ "Wrong"]; à NSString * falseTxt = @ "Wrong"; Ne vous embêtez avec initWithFormat que si vous essayez de calculer une chaîne à partir d'autres entrées, par exemple NSString * falseTxt = [[NSString alloc] initWithFormat: @ "% @ était faux% d fois", craigString, falseCount];
Craig

Réponses:

178

Dois-je vraiment créer une NSString pour "Wrong"?

Non, pourquoi ne pas simplement faire:

if([statusString isEqualToString:@"Wrong"]){
    //doSomething;
}

L'utilisation @""crée simplement une chaîne littérale, qui est une valeur valide NSString.

En outre, puis-je comparer la valeur d'un UILabel.text à une chaîne sans affecter la valeur d'étiquette à une chaîne?

Oui, vous pouvez faire quelque chose comme:

UILabel *label = ...;
if([someString isEqualToString:label.text]) {
    // Do stuff here 
}
Alex Rozanski
la source
Ça marche. Je suppose que j'ai juste du code buggy. C'était une exception avant.
Bryan
1
Pour élaborer: label.text EST une chaîne, vous n'avez donc bien sûr pas besoin d'en créer une pour la comparaison.
Amagrammer
26
if ([statusString isEqualToString:@"Wrong"]) {
    // do something
}
Wevah
la source
Merci wevah. Perspx était 1 seconde plus rapide.
Bryan
8

Brian, cela vaut également la peine d'être ajouté ici - les autres ont bien sûr raison de dire que vous n'avez pas besoin de déclarer une variable chaîne. Cependant, la prochaine fois que vous souhaitez déclarer une chaîne, vous n'avez pas besoin de faire ce qui suit:

NSString *myString = [[NSString alloc] initWithFormat:@"SomeText"];

Bien que ce qui précède fonctionne, il fournit une variable NSString conservée que vous devrez ensuite libérer explicitement après avoir fini de l'utiliser.

La prochaine fois que vous voudrez une variable chaîne, vous pouvez utiliser le symbole "@" d'une manière beaucoup plus pratique:

NSString *myString = @"SomeText";

Cela sera automatiquement publié lorsque vous en aurez terminé, vous éviterez ainsi les fuites de mémoire ...

J'espère que ça t'as aidé!

h4xxr
la source
Je me posais des questions à ce sujet. Je vois souvent des variables de chaîne qui sont des objets objectifs c, mais elles ne sont jamais publiées. Merci!
Bryan
2
L'indice se trouve dans le bit "alloc". Si vous utilisez une allocation (ou une copie), vous devez spécifiquement libérer. Si vous ne le faites pas, la convention est que l'objet sera déjà défini sur autorelease.
h4xxr
Oui, bien qu'il puisse contenir newou copypar exemple newObject(de NSDictionaryController) ou mutableCopy(de NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/…
Alex Rozanski
2

Vous pouvez également utiliser les méthodes de classe NSString qui créeront également une instance libérée automatiquement et auront plus d'options comme le formatage de chaîne:

NSString *myString = [NSString stringWithString:@"abc"];
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42];
danielpunt
la source