iPhone - removeObjectIdenticalTo行为

时间:2012-11-25 19:26:46

标签: iphone ios xcode parsing nsmutablearray

我正在尝试这段代码:

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:str1removeObjectIdenticalTo:@"Toto"相同,因为它应该基于对象地址?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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