是的,硬编码的NSString(字符串文字)(@"..."
源代码中的任何字符串)会在进程运行时变成无限期存在的字符串。
但是,NSArray的containsObject:
方法会调用isEqual:
其对象,因此即使是动态创建的字符串(例如,[NSString stringWithFormat:@"%d", 2]
将YES
在您的示例代码段中返回)也是如此。
这是因为NSString的isEqual:
(或更准确地说,是isEqualToString:
)方法实现为可感知内容的(与比较指针标识相比),因此YES
无论如何以及如何,对于包含完全相同的字符序列的任何一对字符串,都将返回(比较时)它们何时被创建。
要检查是否具有相等的(指针)身份,您必须枚举数组并通过比较
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
if (someString == yourString) {
identicalStringFound = YES;
break;
}
}
(不过,您很可能不希望这样做)。
或者以更方便的方式:
BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;
(您很可能也不想这样做)。
加起来:
所以,原因你得到了肯定的答复,从containsObject:
是不是因为文字字符串共享相同的恒定实例,但因为containsObject:
按照惯例通话isEqual:
,这是内容感知。
你可能想读的(短)文件isEqual:
从NSObject的协议。