2009-08-19 9 views
85

Quiero comparar el valor de NSString con la cadena "Incorrecta". Aquí está mi código:¿Es necesario asignar una cadena a una variable antes de compararla con otra?

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

¿Realmente tengo que crear un NSString para "Wrong"?

Además, ¿puedo comparar el valor de UILabel de text en una cadena sin asignar el valor de la etiqueta a una cadena?

+0

Por cierto, estás perdiendo el tiempo con initWithFormat, puede cambiar NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "Wrong"]; a NSString * wrongTxt = @ "Incorrecto"; Solo moleste con initWithFormat si va a tratar de calcular una cadena a partir de otras entradas, p. NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "% @ fue incorrecto% d veces", craigString, wrongCount]; – Craig

Respuesta

178

¿Realmente tengo para crear un NSString para "incorrecto"?

No, ¿por qué no hacer:

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

Usando @"" simplemente crea una cadena literal, que es una válida NSString.

Además, ¿puedo comparar el valor de un UILabel.text en una cadena sin asignar el valor de la etiqueta a una cadena?

Sí, se puede hacer algo como:

UILabel *label = ...; 
if([someString isEqualToString:label.text]) { 
    // Do stuff here 
} 
+0

Eso funciona. Supongo que solo tengo un código erróneo. Estaba lanzando una excepción antes. – Bryan

+1

Para elaborar: label.text * IS * una cadena, por lo que, por supuesto, no necesita crear una cadena para la comparación. – Amagrammer

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

Gracias wevah. Perspx fue 1 segundo más rápido. – Bryan

8

Brian, también vale la pena tirar aquí - los otros son, por supuesto, cierto que no es necesario declarar una variable de cadena. Sin embargo, la próxima vez que desee declarar una cadena que no es necesario hacer lo siguiente:

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

Aunque el trabajo anterior, proporciona una variable NSString retenido, que a continuación, tendrá que liberar de forma explícita después' he terminado de usarlo.

próxima vez que desee una variable de cadena se puede utilizar el símbolo "@" de una manera mucho más conveniente:

NSString *myString = @"SomeText"; 

Esto se autoreleased cuando haya terminado con él por lo que evitará la memoria fugas también ...

Espero que ayude!

+0

Me preguntaba sobre eso.A menudo veo variables de cadena que son objetos objetivos, pero nunca se liberan. ¡Gracias! – Bryan

+2

La sugerencia está en el bit "alloc". Si usa un Alloc (o copia), debe liberarlo específicamente. Si no lo hace, la convención es que el objeto ya estará configurado para su liberación automática. – h4xxr

+0

Sí, aunque puede contener 'new' o' copy' por ejemplo 'newObject' (from' NSDictionaryController') o 'mutableCopy' (from' NSObject') http://developer.apple.com/documentation/Cocoa/Conceptual /MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-SW1 –

2

También puede utilizar los métodos de la clase NSString que también va a crear una instancia autoreleased y tienen más opciones como el formato de cadenas:

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