Der Grund, warum ==
funktioniert, ist der Zeigervergleich. Wenn Sie eine Konstante NSString
mit definieren@""
, eindeutigisiert der Compiler die Referenz. Wenn dieselben Konstanten an anderen Stellen in Ihrem Code definiert sind, zeigen sie alle auf dieselbe tatsächliche Position im Speicher.
Beim Vergleichen von NSString
Instanzen sollten Sie folgende isEqualToString:
Methode verwenden:
NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%d", (myString2 == myString3)) //0
NSLog(@"%d", (myString1 == myString2)); //1
NSLog(@"%d", [myString1 isEqualToString:myString2]); //1
NSLog(@"%d", [myString1 isEqualToString:myString3]); //1
[myString3 release];
Bearbeiten:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:
erstellt keine neue Referenz mehr, die Sie benötigen initWithFormat
,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
myString3
einen Zeiger auf die Konstante"foo"
, sodass im Allgemeinen alle drei Variablen auf denselben Speicherort verweisen. Dies gilt sowohl für gcc als auch für clang (mit Standardoptionen). Versuchen Sie dies zu kompilieren: gist.github.com/578568