2013-06-04 4 views
1

이상한 문제가 있습니다. 다음 하위 문자열 코드가 충돌합니다.범위 크래시가있는 하위 문자열

NSString *string4 = @"<p>some</p><img></img><p></p>end of the story": 
[string4 substringWithRange:NSMakeRange(7, [string4 length] - 1)]; 

범위 내에 있다고 가정하지만 여전히 충돌합니다. 왜 이런 일이 발생하는지 알고 싶습니다. 다음은 그 오류입니다.

* 인해 캐치되지 않는 예외 'NSRangeException'응용 프로그램 종료, 이유는 : '- [__ NSCFConstantString substringWithRange :] : 범위 또는 인덱스 범위 중' * 먼저 던져 호출 스택 : (0x1c92012 0x10cfe7e 0x1c91deb 0x1c6aaa4 0x2bbc 0xf51c7 0xf5232 0x443d5 0x4476f 0x44905 0x4d917 0x27c5 0x11157 0x11747 0x1294b 0x23cb5 0x24beb 0x16698 0x1beddf9 0x1bedad0 0x1c07bf5 0x1c07962 0x1c38bb6 0x1c37f44 0x1c37e1b 0x1217a 0x13ffc 0x24fd 0x2425) 의 libC++ abi.dylib : 예외 (lldb)

+0

첫 줄 끝 부분에 콜론 (:)이 있습니까? 세미콜론 (;)이어야합니까? – ShinTakezou

+1

범위가 문자열보다 큽니다. 'substringWithRange :'는 문자열 밖에서 부분 문자열을 얻으려고하면 예외를 발생시킵니다. NSMakeRange에 대한 인수는 시작과 끝이 아닌 시작 지점과 길이입니다. – Greg

답변

4

NSMakeRange (7 던지고 호출 종료 [string4 leng 일] - 1)

이 범위는 시작부터 7자를 시작 문자열의 이후 6 개 문자를 종료한다.

범위는 시작 위치와 그 위치에서 원하는 길이로 구성됩니다.

+0

아, 내 잘못이야. 나는 두 번째 매개 변수가 최종 색인이라고 생각했다. 나는 이것에 많은 시간을 낭비했다. 고마워요! – RealityOD

3

NSMakeRange의 두 번째 인수는 부분 문자열에 포함 할 문자 수입니다. 따라서 범위의 시작 위치가 7이므로 [string4 length] - 7 이상이어야합니다. 이것을 시도하십시오 :

NSString *string4 = @"<p>some</p><img></img><p></p>end of the story": 
NSUInteger start = 7; 
[string4 substringWithRange:NSMakeRange(start, [string4 length] - start - 1)];