检查NSArray中是否包含NSString实例

时间:2011-04-27 21:59:10

标签: cocoa nsstring nsarray

我有一个包含大量字符串的数组,我想检查数组中是否包含某个字符串。如果我在阵列上使用containsObject:消息,我会得到正确的结果。具有相同字符串的所有NSString个对象是否指向同一个对象?或者为什么containsObject:工作?

NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if([stringArray containsObject:@"2"]){
  //DO SOMETHING
}

3 个答案:

答案 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
}