Powodem, dla którego ==działa, jest porównanie wskaźników. Podczas definiowania stałej NSStringprzy użyciu @""kompilator ujednolica odwołanie. Gdy te same stałe są zdefiniowane w innych miejscach w kodzie, wszystkie będą wskazywać to samo rzeczywiste miejsce w pamięci.
Porównując NSStringinstancje, należy skorzystać z isEqualToString:metody:
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];
Edytować:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:nie tworzy już nowego odniesienia, będziesz potrzebować initWithFormat,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
myString3wskaźnik do stałej"foo"jako optymalizację, więc ogólnie wszystkie trzy zmienne będą wskazywać na tę samą lokalizację w pamięci. Dotyczy to zarówno gcc, jak i clang (z domyślnymi opcjami). Spróbuj skompilować to: gist.github.com/578568