2009-08-19 9 views
85

Je veux comparer la valeur d'un NSString à la chaîne "Wrong". Voici mon code:Est-il nécessaire d'assigner une chaîne à une variable avant de la comparer à une autre?

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

Est-ce que je dois vraiment créer un NSString pour "Wrong"?

De même, puis-je comparer la valeur d'un textUILabel à une chaîne sans affecter la valeur d'étiquette à une chaîne?

+0

Par ailleurs, vous perdez du temps avec initWithFormat, vous pouvez changer NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "Incorrect"]; à NSString * wrongTxt = @ "Wrong"; Ne vous embêtez qu'avec initWithFormat si vous essayez de calculer une chaîne à partir d'autres entrées, par ex. NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "% @ était incorrect% d fois", craigString, wrongCount]; – Craig

Répondre

178

Dois-je vraiment créer un NSString pour "Faux"?

Non, pourquoi ne pas simplement faire:

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

En utilisant @"" crée simplement une chaîne littérale, qui est un NSString valide.

De même, 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 
} 
+0

Cela fonctionne. Je suppose que j'ai juste du code buggy. Il lançait une exception avant. – Bryan

+1

Pour élaborer: label.text * IS * une chaîne, il n'est donc pas nécessaire de créer une chaîne pour la comparaison. – Amagrammer

26
if ([statusString isEqualToString:@"Wrong"]) { 
    // do something 
} 
+0

Merci beaucoup. Perspx était 1 sec plus rapide. – Bryan

8

Brian, d'une valeur aussi jeter ici - les autres sont bien sûr exact que vous n'avez pas besoin de déclarer une variable de chaîne. Cependant, la prochaine fois que vous voulez déclarer une chaîne que vous n'avez pas besoin de faire ce qui suit:

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

Bien que le travail ci-dessus, il fournit une variable NSString retenue que vous aurez alors besoin de libérer explicitement après que vous J'ai fini de l'utiliser.

prochaine fois que vous voulez créer une variable de chaîne que vous pouvez utiliser le symbole « @ » d'une manière beaucoup plus pratique:

NSString *myString = @"SomeText"; 

Ce sera autoreleased lorsque vous avez fini avec elle afin que vous éviterez la mémoire fuit aussi ...

Espérons que ça aide!

+0

Je me demandais à ce sujet.Je vois souvent des variables chaîne qui sont des objets objectifs c, mais elles ne sont jamais libérées. Merci! – Bryan

+2

L'indice est dans le bit "alloc". Si vous utilisez un Alloc (ou une copie), vous devez le libérer. Si vous ne le faites pas, la convention est que l'objet sera déjà défini sur autorelease. – h4xxr

+0

Oui, bien qu'il puisse contenir 'new' ou' copy' par exemple 'newObject' (de' NSDictionaryController') ou 'mutableCopy' (de' NSObject') http://developer.apple.com/documentation/Cocoa/Conceptual /MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-SW1 –

2

Vous pouvez également utiliser les méthodes de classe NSString qui sera également créer une instance autoreleased et ont plus d'options comme la mise en forme de chaîne:

NSString *myString = [NSString stringWithString:@"abc"]; 
NSString *myString = [NSString stringWithFormat:@"abc %d efg", 42]; 
Questions connexes