La raison pour laquelle cela ==
fonctionne est à cause de la comparaison de pointeurs. Lorsque vous définissez une constante à l' NSString
aide @""
, le compilateur unifie la référence. Lorsque les mêmes constantes sont définies à d'autres endroits de votre code, elles pointeront toutes vers le même emplacement réel en mémoire.
Lorsque vous comparez des NSString
instances, vous devez utiliser la isEqualToString:
méthode:
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];
Éditer:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:
ne crée plus de nouvelle référence, il vous en faudra initWithFormat
,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
myString3
un pointeur vers la constante"foo"
comme optimisation, donc généralement, ces trois variables pointeront vers le même emplacement mémoire. Ceci est vrai pour gcc et clang (avec les options par défaut). Essayez de compiler ceci: gist.github.com/578568