检查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。
然而NSArray的containsObject:
方法调用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
- CGContextDrawImage在传递UIImage.CGImage时将图像上下颠倒
- 我可以将我自己的代码片段添加到xcode 4吗?
- 从UIImageView中删除图像
- 如何拦截MKMapView或UIWebView对象上的触摸事件?
- 如何在iOS中添加“完成”button到数字键盘
- 将“清除”button添加到iPhone UITextField
- 我可以使用NSURLCredentialStorage进行HTTP基本authentication吗?
- 如何构build一个Objective-C静态库?
- NSWindow与NSWindowCollectionBehaviorStation显示在仪表板上。 这是一个错误?