検索

ホームページ  >  に質問  >  本文

ios - substringWithRange:, out of bounds警告

截取<a href="http://weibo.com/" rel="nofollow">微博 weibo.com</a>中的微博 weibo.com这一段字符串。代码如下:

- (void)setSource:(NSString *)source
{
    //字符串示例 <a href="http://weibo.com/" rel="nofollow">微博 weibo.com</a>
    //范围
    NSRange range = NSMakeRange(0, 0);
    
    //获取要截取的字符串的起始字符的位置
    range.location = [source rangeOfString:@">"].location + 1;
    
    //反向检索NSBackwardsSearch
    range.length = [source rangeOfString:@"<" options:NSBackwardsSearch].location - range.location;
    
    _source = [source substringWithRange:range];
}

得出的结构符合预期,但是控制台里探出两条内容一样的警告:

2015-08-18 11:16:57.402 weibo[2568:69911] -[__NSCFConstantString substringWithRange:]: Range {9223372036854775808, 18446744073709551615} out of bounds; string length 0
2015-08-18 11:16:57.403 weibo[2568:69911] -[__NSCFConstantString substringWithRange:]: Range {9223372036854775808, 18446744073709551615} out of bounds; string length 0

我看了几遍,发现如果将_source = [source substringWithRange:range];这一行注释掉,就没有警告了,但是我觉得range没有求错啊,奇了怪了。

ringa_leeringa_lee2773日前801

全員に返信(6)返信します

  • ringa_lee

    ringa_lee2017-04-17 16:14:42

    私はこれを再現しませんでした...あなたのコードを使用しました:

    リーリー

    コンソール出力微博 weibo.com、警告なし...

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 16:14:42

    多くの人がこの問題に遭遇します。 。 。 。

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 16:14:42

    当然のことですが、その理由は、渡すパラメータに「<」と「>」が含まれていないことがあるからです

    信じられない場合は、

    に変更してください リーリー

    返事
    0
  • 迷茫

    迷茫2017-04-17 16:14:42

    上記の方法を試しましたが、まだ警告が表示されます: [__NSCFConstantString substringWithRange:]: Range {9223372036854775808, 18446744073709551615} 範囲外です

    最後に、これを実行します。

    リーリー

    返事
    0
  • 黄舟

    黄舟2017-04-17 16:14:42

    問題は、NSRange が正しく初期化されていないことです。NSRange range = NSMakeRange(0, 0); を使用するのが正しい初期化方法です。 NSRange が初期化中に NSRange range; を使用し、範囲の初期値を指定しない場合、このエラーが発生することがあります -
    Range {9223372036854775808, 18446744073709551615} out of bounds; string length 0
    このエラーは、x、y 値が範囲外であるということです。 {0, 0} に初期化されず、場合によってはエラー内の 2 つの数値に初期化されることがあります。そして、このエラーは修正されていませんが、時々発生します。 2 つの数値 9223372036854775808 と 18446744073709551615 はどちらも、64 ビットに変換するとメモリからオーバーフローします。初期化するとすでにメモリがオーバーフローしています。どうすればそれを見つけることができますか?

    最も重要な点は、このエラーはランダムに発生するということです。たとえば、今日は問題なく使用できても、明日にはエラーが報告される可能性があります。これは Objective-C 言語自体のバグとも言えます。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 16:14:42

    私もこの問題に遭遇しました。ロードされたデータがインターネットからのリアルタイムデータであることが原因である可能性があります。例外がある場合、その前に判定を追加してみてください。 [ソース isEqualToString:@ ""]) return;

    返事
    0
  • キャンセル返事