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);

为什么在这里做与or removeObjectIdenticalTo:str1相同的事情,因为它应该基于对象地址?removeObject:str1removeObjectIdenticalTo:@"Toto"

4

2 回答 2

5

发生这种情况是因为编译器正在根据您处理字符串文字的事实进行一些优化。编译器可能会将字符串 @"Toto" 的所有实例组合到单个内存地址的单个对象中。这是可以做到的,因为它们是不可变的。

这就是为什么有些人会误以为使用==运算符比较两个字符串是可以的。它实际上可以在适当的条件下工作,但绝不能依赖它。

于 2012-11-25T19:30:21.883 回答
0

当您在数组中插入值时,数组将为所有值分配地址,当您将值与数组的值进行比较时,它会检查所有值。它是根据值而不是地址进行比较。所以 Toto 的所有价值都在移除。

于 2012-11-26T13:15:49.767 回答