NSXMLParser:foundCharacters抛出'尝试用appendString改变不可变对象:'

时间:2012-08-06 17:36:40

标签: ios5 nsstring nsxmlparser nsmutablestring

解析XML Feed时遇到问题。每个父节点大约有15个子节点。目前我正在使用stringbytrimmingchartersinset解析所有节点:然后NSCharacterset whitespaceandnewline characterset。 像这样:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
        currentElementValue = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

这适用于除一个节点之外的所有节点。对于此节点,我希望文本按原样通过。我已经尝试设置一个if语句来区别对待这个特定节点,所以我更新到以下内容。

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{

   if ([testingString isEqualToString:@"AdoptionSummary"]) {
       [currentElementValue appendString:string]; //This keeps breaking
        }
    else {
         currentElementValue = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    }

然而我收到了一个错误。

  

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

如果我使用stringbytrimmingchartersinset和appendString的组合,则只会出现错误。但是,如果我使用stringbytrimmingchartersinset或appendString,那么它会自动解析而不会出错。 currentElementValue是一个NSMutableString,为什么会抛出这个错误?

我已尝试查看此NSMutableString appendString generates SIGABRT Error,此error : 'Attempt to mutate immutable object with appendString:' --但无济于事。

我想只是'AdoptionSummary'追加'原样',而另外14个被修剪。我做错了什么?有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

因为currentElementValue被声明为NSString。将其类型更改为NSMutableString

如果已使用NSMutableString声明此字符串,则还必须更改对象创建。更改以下代码:

currentElementValue = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

使用此代码:

currentElementValue = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];

快速处理alloc以避免内存泄漏。

答案 1 :(得分:0)

currentElementValue = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

简单地将NSString强制转换为NSMutableString不会使其成为一个NSString。在修改之前制作一个可变副本。