2013-06-04 77 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的第二个参数是要包含在子字符串中的字符数。因此,它必须不超过[string4 length] - 7,因为范围的起始位置是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)];