La raison pour laquelle cela ==fonctionne est à cause de la comparaison de pointeurs. Lorsque vous définissez une constante à l' NSStringaide @"", 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 NSStringinstances, 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"];
myString3un 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