La razón por la que ==
funciona es debido a la comparación de punteros. Cuando define un NSString
uso constante @""
, el compilador uniquifica la referencia. Cuando se definen las mismas constantes en otros lugares de su código, todas apuntarán a la misma ubicación real en la memoria.
Al comparar NSString
instancias, debe utilizar el isEqualToString:
método:
NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%d", (myString2 == myString3))
NSLog(@"%d", (myString1 == myString2));
NSLog(@"%d", [myString1 isEqualToString:myString2]);
NSLog(@"%d", [myString1 isEqualToString:myString3]);
[myString3 release];
Editar:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:
ya no crea una nueva referencia, necesitará initWithFormat
,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
myString3
un puntero a la constante"foo"
como una optimización, por lo que, en general, estas tres variables apuntarán a la misma ubicación de memoria. Esto es cierto tanto para gcc como para clang (con opciones predeterminadas). Intente compilar esto: gist.github.com/578568