0

私はこのコードを試しています:

NSString* str1 = @"Toto";
NSMutableArray* arr = [NSMutableArray array];

[arr addObject:[NSNull null]];
[arr addObject:@"toto"];
[arr addObject:[NSNull null]];
[arr addObject:@"Toto"];
[arr addObject:[NSNull null]];
[arr addObject:str1];

NSLog(@"Tableau à %d elements : %@", [arr count], arr);

[arr removeObjectIdenticalTo:str1];

NSLog(@"Tableau à %d elements : %@", [arr count], arr);

オブジェクトアドレスに基づいているはずなのに、removeObjectIdenticalTo:str1ここでremoveObject:str1or と同じことをするのはなぜですか?removeObjectIdenticalTo:@"Toto"

4

2 に答える 2

5

これは、文字列リテラルを扱っているという事実に基づいて、コンパイラがいくつかの最適化を行っているために発生しています。コンパイラはおそらく、文字列 @"Toto" のすべてのインスタンスを 1 つのメモリ アドレスで 1 つのオブジェクトに結合しています。これらは不変であるため、これを行うことができます。

==これが、演算子を使用して 2 つの文字列を比較しても問題ないと考える人がいる理由です。実際には適切な条件下で機能しますが、決して信頼してはなりません。

于 2012-11-25T19:30:21.883 に答える
0

配列に値を挿入すると、配列はすべての値にアドレスを割り当て、値を配列の値と比較すると、すべての値をチェックします。アドレスではなく値に従って比較しています。したがって、トトのすべての値は削除されます。

于 2012-11-26T13:15:49.767 に答える