我有一个包含一堆字符串的数组,我想检查数组中是否包含某个字符串。如果我在数组上使用 containsObject
: 消息,我会得到正确的结果。具有相同字符串的所有 NSString
对象是否都指向同一个对象?或者为什么 containsObject
: 有效?
NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if([stringArray containsObject:@"2"]){
//DO SOMETHING
}
最佳答案
是的,硬编码的 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:
获得肯定答复的原因是 NOT 因为文字字符串共享相同的常量实例,BUT 因为containsObject:
按照约定调用 isEqual:
,它是内容感知的。
您可能想阅读 NSObject protocol 中的 isEqual:
的(简短)文档。 .
关于cocoa - 检查 NSString 实例是否包含在 NSArray 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5811121/