the*_*end 75 cocoa nsstring nsarray
我有一个包含一堆字符串的数组,我想检查数组中是否包含某个字符串.如果我containsObject在数组上使用:message,我会得到正确的结果.NSString具有相同字符串的所有对象是否指向同一对象?或者为什么containsObject:工作?
NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if([stringArray containsObject:@"2"]){
  //DO SOMETHING
}
Reg*_*ent 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:是不是因为文字字符串共享相同的恒定实例,但因为containsObject:按照惯例要求isEqual:,这是内容感知.
您可能希望isEqual:从NSObject协议中读取(简短)文档.
ugh*_*fhw 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] == YES
2011-04-27 17:10:54.706 a.out [41699:903] theArray包含:
constantString:1
constantString2:1
dynamicString: 1
您可以用来containsObject查找某个字符串是否存在,
NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if ( [stringArray containsObject: stringToFind] ) {
    // if found
} else {
    // if not found
}
| 归档时间: | 
 | 
| 查看次数: | 37616 次 | 
| 最近记录: |