==
動作する理由は、ポインタの比較のためです。を使用して定数NSString
を定義する@""
と、コンパイラは参照を一意化します。コード内の他の場所で同じ定数が定義されている場合、それらはすべてメモリ内の同じ実際の場所を指します。
NSString
インスタンスを比較するときは、次のisEqualToString:
方法を使用する必要があります。
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];
編集:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:
これ以上新しい参照を作成しません。必要initWithFormat
になります、
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
myString3
定数へのポインタも作成する"foo"
ため、通常、これら3つの変数はすべて同じメモリ位置を指します。これは、gccとclangの両方に当てはまります(デフォルトのオプションを使用)。これをコンパイルしてみてください:gist.github.com/578568