¿Es necesario asignar una cadena a una variable antes de compararla con otra?

85

Quiero comparar el valor de an NSStringcon la cadena "Incorrecto". Aquí está mi código:

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

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

Además, puedo comparar el valor de un UILabel's texten una cadena sin asignar el valor de la etiqueta a una cadena?

Bryan
fuente
Por cierto, está perdiendo el tiempo con initWithFormat, puede cambiar NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "Wrong"]; a NSString * wrongTxt = @ "Incorrecto"; Solo moleste con initWithFormat si va a intentar calcular una cadena a partir de otras entradas, por ejemplo, NSString * wrongTxt = [[NSString alloc] initWithFormat: @ "% @ was wrong% d times", craigString, wrongCount];
Craig

Respuestas:

178

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

No, por qué no hacer:

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

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

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

Sí, puedes hacer algo como:

UILabel *label = ...;
if([someString isEqualToString:label.text]) {
    // Do stuff here 
}
Alex Rozanski
fuente
Eso funciona. Supongo que solo tengo un código con errores. Antes lanzaba una excepción.
Bryan
1
Para elaborar: label.text ES una cadena, por lo que, por supuesto, no necesita crear una cadena a partir de ella para la comparación.
Amagrammer
26
if ([statusString isEqualToString:@"Wrong"]) {
    // do something
}
Wevah
fuente
Gracias wevah. Perspx fue 1 segundo más rápido.
Bryan
8

Brian, también vale la pena incluirlo aquí; los otros, por supuesto, tienen razón en que no es necesario declarar una variable de cadena. Sin embargo, la próxima vez que desee declarar una cadena, no es necesario que haga lo siguiente:

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

Aunque lo anterior funciona, proporciona una variable NSString retenida que luego deberá liberar explícitamente una vez que haya terminado de usarla.

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

NSString *myString = @"SomeText";

Esto se liberará automáticamente cuando haya terminado con él, por lo que también evitará pérdidas de memoria ...

¡Espero que ayude!

h4xxr
fuente
Me estaba preguntando sobre eso. A menudo veo variables de cadena que son objetos objetivos c, pero nunca se publican. ¡Gracias!
Bryan
2
La pista está en el bit "alloc". Si usa un Alloc (o una copia), debe liberarlo específicamente. Si no lo hace, la convención es que el objeto ya estará configurado para liberación automática.
h4xxr
Sí, aunque puede contener newo, copypor ejemplo, newObject(de NSDictionaryController) o mutableCopy(de NSObject) developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/…
Alex Rozanski
2

También puede usar los métodos de la clase NSString que también crearán una instancia liberada automáticamente y tendrán más opciones como formato de cadena:

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