【问题标题】:Can't catch range out of bounds exception in Objective-c无法在 Objective-c 中捕获范围越界异常
【发布时间】:2015-09-25 20:54:17
【问题描述】:

我在 xCode 中收到此错误消息:

-[__NSCFString substringWithRange:]: Range {18446744073709551615, 1} out of bounds; string length 71. This will become an exception for apps linked after 10.10 and iOS 8. Warning shown once per app execution.

我试图在我的代码中找到发生这种情况的位置。

我的项目中有大约十几个 substringWithRange 方法。我在它们周围放了 try catch 块:

 @try {
        substring = [s substringWithRange:NSMakeRange(i, j - i)];
    }
    @catch (NSException* e) {
        NSLog(@"Except: %@", e);
    }

没有任何 catch 块正在执行。

我尝试将我的部署目标设置为 8.4。

任何帮助将非常感谢!

【问题讨论】:

  • 你不需要 try/catch。使用调试器查看应用崩溃的位置。
  • 它不会崩溃它会停止......
  • “它停止”是什么意思?您的意思是调试器停止在导致问题的行上?
  • 调试器不会在任何地方停止,尽管我将断点设置为在异常时停止。它几乎就像陷入了无限循环。我得到错误然后什么也没有发生

标签: objective-c exception substring nsrange


【解决方案1】:

大值18446744073709551615是NSNotFound的值(2^64-1,64位能表示的最大整数)。

您可能首先在另一个字符串中寻找(子)字符串,但找不到该子字符串。你得到的不是有效的索引NSNotFound。大概您没有预料到或没有测试这种特殊情况,而是将 NSNotFound 值传递给了 NSMakeRange(),从而触发了错误。

如您所指出的,如果您调用 NSMakeRange 的地方很少,那么您应该能够 (1) 验证此假设并 (2) 仅通过检查代码来修复错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多