检查NSString实例是否包含在NSArray中


79

我有一个带有一堆字符串的数组,我想检查数组中是否包含某个字符串。如果containsObject在数组上使用:消息,则得到正确的结果。NSString具有相同字符串的所有对象都指向同一对象吗?还是为什么containsObject:工作?

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

Answers:


170

是的,硬编码的NSString(字符串文字)(@"..."源代码中的任何字符串)会在进程运行时变成无限期存在的字符串。

但是,NSArraycontainsObject:方法会调用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的协议


17

containsObject:执行值检查,而不是指针检查。它使用isEqual:由NSObject定义并被其他对象覆盖的方法进行测试。因此,如果两个字符串包含相同的字符序列,则它们将被视为相同。

在某些情况下,指针测试和值测试之间的区别非常重要。源代码中定义的常量字符串由编译器组合,以便它们是同一对象。但是,动态创建的字符串不是同一对象。这是一个示例程序,将演示这一点:

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] ==是
2011-04-27 17:10:54.706 a.out [41699:903] theArray包含:
constantString:1
constantString2:1
dynamicString: 1个


4

您可以containsObject用来查找是否存在某些字符串,

NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];

if ( [stringArray containsObject: stringToFind] ) {
    // if found
} else {
    // if not found
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.