動作する理由==は、ポインタの比較のためです。NSStringを使用して定数を定義する@""と、コンパイラは参照を一意化します。コード内の他の場所で同じ定数が定義されている場合、それらはすべてメモリ内の同じ実際の場所を指します。
NSStringインスタンスを比較するときは、次のisEqualToString:方法を使用する必要があります。
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];
編集:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:これ以上新しい参照を作成しません。必要になりますinitWithFormat、
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];