我正在尝试这段代码:
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:str1
或removeObjectIdenticalTo:@"Toto"
相同,因为它应该基于对象地址?
答案 0 :(得分:5)
这种情况正在发生,因为编译器正在根据您处理字符串文字的事实进行一些优化。编译器可能将字符串@“Toto”的所有实例组合到单个内存地址的单个对象中。这可以做到,因为它们是不可变的。
这就是为什么有些人会因为使用==
运算符来比较两个字符串而感到困惑。它实际上可以在合适的条件下工作,但绝不能依赖它。
答案 1 :(得分:0)
当您在数组中插入值时,数组会将地址分配给所有值,当您将值与数组值进行比较时,它会检查所有值。它是根据价值而不是地址进行比较。所以Toto的所有价值都在消失。