1. ホーム
  2. objective-c

[解決済み] NSStringの比較を理解する

2023-05-15 15:34:53

質問

次の比較は両方とも真と評価されます。

1)

@"foo" == @"foo";

2)

NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
myString1 == myString2;

しかし、2つの NSString を等号演算子で比較することができない場合があります。 [myString1 isEqualToString:myString2] が必要です。 どなたか、この点について教えていただけませんか?

どのように解決するのですか?

その理由 == が動作するのは、ポインタの比較のためです。定数を定義すると 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"];