【问题标题】:Substring with range crashes范围崩溃的子字符串
【发布时间】:2013-06-04 06:49:53
【问题描述】:

我遇到了奇怪的问题。以下子字符串代码因

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

我假设范围在边界内,但它仍然崩溃。 知道为什么会这样吗? 以下是它显示的错误。

* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“-[__NSCFConstantString substringWithRange:]: Range or index out of bounds” * 首先抛出调用栈: (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)

【问题讨论】:

  • 在第一行的末尾,是冒号 (:) 吗?应该是分号(;)?
  • 你的范围比你的字符串大。如果您尝试在字符串之外获取子字符串,substringWithRange: 将引发异常。 NSMakeRange 的参数是起点和长度,而不是起点和终点。

标签: objective-c substring nsrangeexception


【解决方案1】:

NSMakeRange(7, [string4 长度] - 1)

此范围从字符串开头 7 个字符开始,到字符串结尾之后结束 6 个字符。

范围由起始位置和从该位置开始的所需长度组成。

【讨论】:

  • 啊,我的错。我认为第二个参数是结束索引。我在这上面浪费了很多时间。非常感谢!
【解决方案2】:

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)];

【讨论】:

    猜你喜欢
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多