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

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

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

是的,硬编码的NSStrings(string文字)(即源代码中的任何@"..." )将转换为在您的进程正在运行时无限期存在的string。

然而NSArraycontainsObject:方法调用isEqual:在它的对象上,因此即使是一个dynamic创build的string,例如[NSString stringWithFormat:@"%d", 2] ,你的示例代码片段也会返回YES
这是因为NSString的isEqual: (或更确切地说它的isEqualToString:方法被实现为内容感知(与比较指针标识) ,因此对于包含相同字符序列的任何string对(在​​比较时)返回YES无论他们是如何创build的

要检查相等(指针)的身份,你必须枚举你的数组,并通过比较

 NSString *yourString = @"foo"; BOOL identicalStringFound = NO; for (NSString *someString in stringArray) { if (someString == yourString) { identicalStringFound = YES; break; } } 

(尽pipe你很可能不想要)。

或者以更方便的方式:

 BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound; 

(你很可能不希望这一个)。


加起来:

所以你从containsObject:获得肯定回复的原因不是因为文字string共享相同的常量实例, 而是因为containsObject:通过约定调用isEqual:这是内容感知。

您可能需要从NSObject协议中读取isEqual:的(简短)文档。

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

指针testing和价值testing之间的区别在某些情况下非常重要。 在源代码中定义的常量string由编译器组合,以便它们是相同的对象。 但是,dynamic创build的string不是同一个对象。 这里是一个示例程序,将演示这个:

 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包含:
常量string:1
constantString2:1
dynamicString:1