はい、ハードコードされたNSStrings(文字列リテラル)は(つまり、ソースコード内の任意の@"..."
である)あなたのプロセスが実行中に無限に存在する文字列になっています。
しかしにNSArrayのcontainsObject:
方法は、したがってな[NSString stringWithFormat:@"%d", 2]
としても、動的に作成された文字列はあなたのサンプルスニペットでYES
を返します、そのオブジェクトにisEqual:
を呼び出します。
のNSStringのisEqual:
(またはより正確にはそのisEqualToString:
)メソッドがコンテンツ認識するように実装されている(ポインタIDを比較対)とは、このように文字の非常に同一の配列を含む文字列の任意のペアのためYES
を返すためである(時比較)は、いつ、どのように作成されたかにかかわらず。
(あなたが最も可能性が高いものの、たくないであろう)、あなたの配列を列挙し、
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
if (someString == yourString) {
identicalStringFound = YES;
break;
}
}
を経由して比較する必要があると思い等しい(pointer-)身元を確認するために。
以上の便利な方法で:
BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;
(あなたが最も可能性が高いのいずれか、このいずれかを望んでいないだろう)。
総括:
を慣例によりcontainsObject:
がisEqual:
を呼び出すためのリテラル文字列が同じ一定の場合、しかしを共有するためですから、containsObject:
から肯定応答を取得している理由は、ではありませんこれはコンテンツに対応しています。
NSObject protocolからisEqual:
の短いドキュメントを読むことができます。