【问题标题】:NSXMLParser:foundCharacters throwing 'Attempt to mutate immutable object with appendString:'NSXMLParser:foundCharacters 抛出“尝试使用 appendString 改变不可变对象:”
【发布时间】:2012-08-03 17:04:23
【问题描述】:

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

- (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 个被修剪。我做错了什么?有什么建议吗?

谢谢!

【问题讨论】:

    标签: ios5 nsstring nsxmlparser nsmutablestring


    【解决方案1】:

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

    如果你已经用 NSMutableString 声明了这个字符串,那么你也必须改变对象的创建。更改以下代码:

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

    使用此代码:

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

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

    【讨论】:

    • 它实际上在我的 .h 接口 Parser 中被声明为 NSMutableString : NSObject { KHMAppDelegate *app;列出 *theList; NSMutableString *currentElementValue; } 属性 NSString *testingString; -(id)初始化解析器;结束
    • @Apurvu,currentElementValue = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; 成功了!!太感谢了!这个项目使用ARC,我还需要手动dealloc吗? (对不起,nOOb 问题)再次感谢!
    • 不,它不是必需的。另外,接受答案。所以它也可以帮助其他人。
    【解决方案2】:
    currentElementValue = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      相关资源
      最近更新 更多