搜尋

首頁  >  問答  >  主體

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 天前797

全部回覆(6)我來回復

  • ringa_lee

    ringa_lee2017-04-17 16:14:42

    我這沒有重現…用的是你的程式碼:

        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…

    回覆
    0
  • PHP中文网

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

    很多人都遇到這個問題。 。 。 。

    回覆
    0
  • 天蓬老师

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

    不奇怪,原因是你傳進來的參數有時候沒有"<"和">"

    不信你改成

    - (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];
    }

    回覆
    0
  • 迷茫

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

    上面的法子試了,可還是有警告:[__NSCFConstantString substringWithRange:]: Range {9223372036854775808, 18446744073709551615} out of bounds;

    最後,我這麼做,

    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]];
        }
    
    

    回覆
    0
  • 黄舟

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

    這個問題在於你的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吧。

    回覆
    0
  • PHP中文网

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

    我也遇到過這個問題,可能是因為載入的資料是網路上的即時數據,存在異常這就會造不定時崩潰,在前邊加個判斷試試看
    if ([source isEqualToString:@""]) return;

    回覆
    0
  • 取消回覆