Prateekの答えとThomasの編集された答えは正しいです。しかし、この種のケースに対処する際によくある落とし穴/混乱を追加したいだけです..
このケースを考えてみましょう
NSString *str1 = [[NSString alloc] initWithString:@"hello"];
NSString *str2 = [[NSString alloc] initWithString:@"hello"];
理想的str1
にstr2
は、2 つの異なる文字列オブジェクトである必要があり、str1 と str2 は異なるアドレスを指している必要があります。ただし、以下のコードを実行すると印刷されますstr1 == str2
if(str1 == str2){
NSLog(@"str1 == str2");
}
以下のコードプリントstr1 isEqual str2
if([str1 isEqual:str2]){
NSLog(@"str1 isEqual str2");
}
その理由は、渡された 2 つの同一の文字列リテラルがinitWithString
start に同じアドレスを持つため、同じオブジェクトでもあるからです (これを参照してください)。これは、定数データの最適化です。これは、iOS (および私が感じる他の多くの実装) の機能です。
ただし、これは他の種類のオブジェクト/クラスでは機能しません。2 を作成するUIButton
と、それらは完全に異なるオブジェクトになり、両方btn1
とbtn2
(質問を参照) は異なるアドレスを指します。