我有一个包含大量字符串的数组,我想检查数组中是否包含某个字符串。如果我在阵列上使用containsObject
:消息,我会得到正确的结果。具有相同字符串的所有NSString
个对象是否指向同一个对象?或者为什么containsObject
:工作?
NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if([stringArray containsObject:@"2"]){
//DO SOMETHING
}
答案 0 :(得分:168)
是的,硬编码的NSStrings(字符串文字)(即源代码中的任何@"..."
)会变成在您的进程运行时无限期存在的字符串。
然而 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 ,因为{{1}按惯例调用containsObject:
,这是内容感知的。
您可能希望从NSObject protocol阅读isEqual:
的(简短)文档。
答案 1 :(得分:17)
containsObject:
执行值检查,而不是指针检查。它使用NSObject定义的isEqual:
方法,并被其他对象覆盖以进行测试。因此,如果两个字符串包含相同的字符序列,则它们将被视为相同。
在某些情况下,指针测试和值测试之间的区别非常重要。源代码中定义的常量字符串由编译器组合,以便它们是同一个对象。但是,动态创建的字符串不是同一个对象。这是一个示例程序,将演示如下:
int main(int argc, char **argv) {
NSAutoreleasePool *p = [NSAutoreleasePool new];
NSString *constantString = @"1";
NSString *constantString2 = @"1";
NSString *dynamicString = [NSString stringWithFormat:@"%i",1];
NSArray *theArray = [NSArray arrayWithObject:constantString];
if(constantString == constantString2) NSLog(@"constantString == constantString2");
else NSLog(@"constantString != constantString2");
if(constantString == dynamicString) NSLog(@"constantString == dynamicString");
else NSLog(@"constantString != dynamicString");
if([constantString isEqual:dynamicString]) NSLog(@"[constantString isEqual:dynamicString] == YES");
else NSLog(@"[constantString isEqual:dynamicString] == NO");
NSLog(@"theArray contains:\n\tconstantString: %i\n\tconstantString2: %i\n\tdynamicString: %i",
[theArray containsObject:constantString],
[theArray containsObject:constantString2],
[theArray containsObject:dynamicString]);
}
该程序的输出是:
2011-04-27 17:10:54.686 a.out [41699:903] constantString == constantString2
2011-04-27 17:10:54.705 a.out [41699:903] constantString!= dynamicString
2011-04-27 17:10:54.706 a.out [41699:903] [constantString isEqual:dynamicString] == YES
2011-04-27 17:10:54.706 a.out [41699:903] theArray包含:
constantString:1
constantString2:1
dynamicString:1
答案 2 :(得分:2)
您可以使用containsObject
查找某个字符串是否存在,
NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if ( [stringArray containsObject: stringToFind] ) {
// if found
} else {
// if not found
}