NSString 인스턴스가 NSArray에 포함되어 있는지 확인


80

여러 문자열이있는 배열이 있고 특정 문자열이 배열에 포함되어 있는지 확인하고 싶습니다. containsObject배열 에서 : 메시지를 사용하면 올바른 결과를 얻습니다. NSString동일한 문자열을 가진 모든 객체가 동일한 객체를 가리 킵니까? 아니면 왜 containsObject작동합니까?

답변:


171

예, 하드 코딩 된 NSString (문자열 리터럴) (즉 @"...", 소스 코드에 있음)은 프로세스가 실행되는 동안 무기한 존재하는 문자열로 변환됩니다.

그러나 NSArraycontainsObject:메소드 isEqual:는 객체를 호출 하므로 샘플 스 니펫에서 반환 되는 것과 같이 동적으로 생성 된 문자열 도 마찬가지 [NSString stringWithFormat:@"%d", 2] 입니다YES .
이는 NSString의 isEqual:(또는 더 정확하게는 그것의 isEqualToString:) 메소드가 내용을 인식 하도록 구현되어 (포인터 ID 비교와 비교) , 따라서 YES(비교시) 매우 동일한 문자 시퀀스를 포함하는 모든 문자열 쌍 을 반환 하기 때문입니다. 그들이 만들어 졌을 때.

동일한 (포인터) ID를 확인하려면 배열을 열거하고 다음을 통해 비교해야합니다.

(하지만 아마도 원하지 않을 것입니다).

또는 더 편리한 방식으로 :

(이것도 원하지 않을 것입니다).


합산:

이유 그래서 당신은에서 긍정적 인 답변을 얻고 containsObject:있다 NOT 리터럴 문자열이 같은 일정 인스턴스를 공유하기 때문에, 하지만 인해 containsObject:대회 호출하여 isEqual:콘텐츠를 인식.

NSObject 프로토콜isEqual: 에서에 대한 (짧은) 문서를 읽을 수 있습니다 .


17

containsObject:포인터 검사가 아닌 값 검사를 수행합니다. isEqual:NSObject에 의해 정의되고 테스트를 위해 다른 개체에 의해 재정의 된 메서드를 사용합니다 . 따라서 두 문자열에 동일한 문자 시퀀스가 ​​포함되어 있으면 동일한 것으로 간주됩니다.

포인터 테스트와 값 테스트의 차이는 경우에 따라 매우 중요합니다. 소스 코드에 정의 된 상수 문자열은 컴파일러에 의해 결합되어 동일한 객체가됩니다. 그러나 동적으로 생성 된 문자열은 동일한 객체가 아닙니다. 다음은이를 보여주는 예제 프로그램입니다.

이 프로그램의 출력은 다음과 같습니다.

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특정 문자열이 있는지 확인 하는 데 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.