Powodem, dla którego ==
działa, jest porównanie wskaźników. Podczas definiowania stałej NSString
przy 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 NSString
instancje, 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"];
myString3
wskaź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