ios - substringWithRange:, out of bounds警告
ringa_lee
ringa_lee 2017-04-17 16:12:42
0
6
796

截取<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_lee
ringa_lee

ringa_lee

全員に返信(6)
左手右手慢动作

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

リーリー

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

いいねを押す +0
洪涛

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

いいねを押す +0
Peter_Zhu

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

信じられない場合は、

に変更してください リーリー
いいねを押す +0
迷茫

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

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

リーリー
いいねを押す +0
黄舟

問題は、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
Ty80

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート