The reason why ==
works is because of pointer comparison. When you define a constant NSString
using @""
, the compiler uniquifies the reference. When the same constants are defined in other places in your code, they will all point to the same actual location in memory.
When comparing NSString
instances, you should use the isEqualToString:
method:
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];
Edit:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:
does not create a new reference any more, you will need initWithFormat
,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
myString3
a pointer to the constant"foo"
as an optimization, so generally, all three of these variables will point to the same memory location. This is true for both gcc and clang (with default options). Try compiling this: gist.github.com/578568 – Attention