首页 > substringWithRange:, out of bounds警告

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没有求错啊,奇了怪了。


这个问题在于你的NSRange初始化不对,用 NSRange range = NSMakeRange(0, 0);才是正确的初始化方法。NSRange在初始化的时候如果用NSRange range;,没有指定range的初值,就会有时候出现这个错误——
Range {9223372036854775808, 18446744073709551615} out of bounds; string length 0
这个错误就是,range{x,y}里面的x、y值超出范围了,因为你没有初始化为{0, 0},有时候会被初始化成错误中的那两个数。而且这个错误并不是固定的,而是偶尔出现的。9223372036854775808和18446744073709551615这两个数字,转成64位都内存溢出了。你在初始化的时候,就已经内存溢出了,还怎么查找啊?

最关键的一点是——这个错误还是随机出现的!比如我今天用着还好好的,可能明天就报错了。这个可以说是Objective-C语言自身的bug吧。


上面的法子试了,可还是有警告:[__NSCFConstantString substringWithRange:]: Range {9223372036854775808, 18446744073709551615} out of bounds; string length 0

最后,我这么做,

if (source.length != 0) {
        NSRange range = NSMakeRange(0, 0);
        range.location = [source rangeOfString:@">"].location + 1;
        range.length = [source rangeOfString:@"<" options:NSBackwardsSearch].location - range.location;
        
        _source = [NSString stringWithFormat:@"来自%@",[source substringWithRange:range]];
    }


很多人都遇到这个问题。。。。


不奇怪,原因是你传进来的参数有时候没有"<"和">"

不信你改成

- (void)setSource:(NSString *)source
{
    //字符串示例 <a href="http://weibo.com/" rel="nofollow">微博 weibo.com</a>
    //范围
    
    NSAssert([source rangeOfString:@">"].location!=NSNotFound, source);
    NSAssert([source rangeOfString:@"<"].location!=NSNotFound, source);
    
    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];
}

我这没有重现…… 用的是你的代码:

    source = @"<a href=\"http://weibo.com/\" rel=\"nofollow\">微博 weibo.com</a>";
    NSRange range = NSMakeRange(0, 0);
    range.location = [source rangeOfString:@">"].location + 1;
    range.length = [source rangeOfString:@"<" options:NSBackwardsSearch].location - range.location;
    NSLog(@"%@", [source substringWithRange:range]);

控制台输出微博 weibo.com,没有warning……


我也遇到过这问题,可能是因为加载的数据是网上的实时数据,存在异常这就会造不定时崩溃,在前边加个判断试一下
if ([source isEqualToString:@""]) return;

【热门文章】
【热门文章】