这里在我的代码中我试图加载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的对象:'
答案 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];
}
}