截取<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没有求错啊,奇了怪了。
私はこれを再現しませんでした...あなたのコードを使用しました:
リーリーコンソール出力
微博 weibo.com
、警告なし...多くの人がこの問題に遭遇します。 。 。 。
当然のことですが、その理由は、渡すパラメータに「<」と「>」が含まれていないことがあるからです
信じられない場合は、
に変更してください リーリー上記の方法を試しましたが、まだ警告が表示されます: [__NSCFConstantString substringWithRange:]: Range {9223372036854775808, 18446744073709551615} 範囲外です
最後に、これを実行します。
リーリー問題は、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 言語自体のバグとも言えます。
私もこの問題に遭遇しました。ロードされたデータがインターネットからのリアルタイムデータであることが原因である可能性があります。例外がある場合、その前に判定を追加してみてください。 [ソース isEqualToString:@ ""]) return;