【问题标题】:why do i have error for deleting Characters from NSString?为什么我从 NSString 中删除字符时出错?
【发布时间】:2011-11-26 04:21:07
【问题描述】:

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

这里是 ROBOTS.TXT 的示例

用户代理:*

禁止:/搜索

禁止:/groups

禁止:/图像

禁止:/目录

允许:/catalogs/about

不允许:/catalogues

不允许:/news

允许:/news/directory

这是我拥有的代码:

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 的对象:'

【问题讨论】:

  • stackoverflow.com/questions/1242335/… 这个问题可能与您有关,可能会回答您的问题。希望对你有帮助
  • 注意[[[NSMutableArray alloc] init] autorelease];可以写得更清楚更简单:[NSMutableArray array]; 方便的方法可以帮助编写干净的代码,它们可以在ARC和非ARC代码中使用。

标签: objective-c nsmutablestring


【解决方案1】:

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

可能是你需要的:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多