여러 문자열이있는 배열이 있고 특정 문자열이 배열에 포함되어 있는지 확인하고 싶습니다. containsObject
배열 에서 : 메시지를 사용하면 올바른 결과를 얻습니다. NSString
동일한 문자열을 가진 모든 객체가 동일한 객체를 가리 킵니까? 아니면 왜 containsObject
작동합니까?
NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if([stringArray containsObject:@"2"]){
//DO SOMETHING
}
답변
예, 하드 코딩 된 NSString (문자열 리터럴) (즉 @"..."
, 소스 코드에 있음)은 프로세스가 실행되는 동안 무기한 존재하는 문자열로 변환됩니다.
그러나 NSArray 의 containsObject:
메소드 isEqual:
는 객체를 호출 하므로 샘플 스 니펫에서 반환 되는 것과 같이 동적으로 생성 된 문자열 도 마찬가지 [NSString stringWithFormat:@"%d", 2]
입니다YES
.
이는 NSString의 isEqual:
(또는 더 정확하게는 그것의 isEqualToString:
) 메소드가 내용을 인식 하도록 구현되어 (포인터 ID 비교와 비교) , 따라서 YES
(비교시) 매우 동일한 문자 시퀀스를 포함하는 모든 문자열 쌍 을 반환 하기 때문입니다. 그들이 만들어 졌을 때.
동일한 (포인터) ID를 확인하려면 배열을 열거하고 다음을 통해 비교해야합니다.
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 리터럴 문자열이 같은 일정 인스턴스를 공유하기 때문에, 하지만 인해 containsObject:
대회 호출하여 isEqual:
콘텐츠를 인식.
NSObject 프로토콜isEqual:
에서에 대한 (짧은) 문서를 읽을 수 있습니다 .
답변
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
답변
containsObject
특정 문자열이 있는지 확인 하는 데 사용할 수 있습니다 .
NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if ( [stringArray containsObject: stringToFind] ) {
// if found
} else {
// if not found
}