为什么我有从NSString删除字符的错误?

时间:2011-11-26 04:21:08

标签: objective-c nsmutablestring

这里在我的代码中我试图加载ROBOTS.TXT文件,然后通过“Disallow”字符串过滤它们,然后如果该行有“Disallow string”,则删除此字符串并返回其余行。

这是ROBOTS.TXT的样本

  

用户代理:*

     

禁止:/搜索

     

禁止:/ groups

     

禁止:/ images

     

禁止:/ catalogs

     

允许:/ catalogs / about

     

禁止:/ catalogs

     

禁止:/ news

     

允许:/ news /目录

这是我的代码:

NSRange range;
NSURL *url=[NSURL URLWithString:@"http://www.google.com/robots.txt"];

NSString *content = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

NSArray *parsed = [content componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

NSMutableArray *robots=[[[NSMutableArray alloc] init] autorelease];

NSMutableString *line= [[[NSMutableString alloc] init] autorelease];


for(line in parsed){
    range=[line rangeOfString:@"Disallow"];
    if (range.location != NSNotFound) {
        [line deleteCharactersInRange: NSMakeRange(1,9 )];
        [robots addObject:line];

    }
}   

这是错误:

  

* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'尝试变异不可变   具有deleteCharactersInRange的对象:'

2 个答案:

答案 0 :(得分:0)

方法componentsSeparatedByCharactersInSet返回NSString的NSArray。 NSString是不可变的。您将行声明为NSMutableString,但是分配给line的对象仍然是NSString。

答案 1 :(得分:0)

line中的变量for(line in parsed)是不可变的,因为for-in语句构造返回了NSString。

可能你需要的是:

for(NSString *line in parsed) {
    if [line hasPrefix:@"Disallow"]) {
        [robots addObject:[line substringFromIndex:9];
    }
}