2013-01-31 57 views
0

所以我遇到了这个奇怪的问题。我们在NSXMLParser上构建了一个解析器,它首先实例化一个对象,然后根据刚刚结束的XML元素设置它的值。基本上,它将XML文件转换为可重用的NSObject单元测试时,空格出现在字符串末尾

现在我在解析器中设置一个断点来确定,如果值设置正确。

Screenshot debugger

嗯,这看起来不错。正确解析。让我为此写一个单元测试。

assertThat([parsedPerson dateOfBirth], is(equalTo(@"22.06.1949"))); 

现在发生这种情况。我得到以下控制台输出:

Expected "22.06.1949", but was "22.06.1949  " 

什么?空格从哪里来?让我调试单元测试中的对象。

Screenshot debugger 2

相同的内存地址?同一个对象?空格从哪里来?有人有想法吗?

+0

在测试中,这个字符串值从哪里来? –

+0

它基本上是从解析器获取的同一个对象。解析器初始化对象,分配字符串值,我使用同一个对象并读取字符串值。但它不仅在测试中,我会编辑我的答案来解释。 –

回答

2

我发现它与解析器本身有关,而空白字符实际上是XML文件中的真实空白字符。

我们已经(有)以下设置:

- (void)parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict { 
    [self setCurrentString: [NSMutableString string]]; 
} 

- (void)parser: (NSXMLParser *) parser foundCharacters: (NSString *) string { 
    string = [string stringByReplacingOccurrencesOfString: @"\n" withString: @""]; 
    string = [string stringByReplacingOccurrencesOfString: @"\t" withString: @""]; 
    [currentString appendString: string]; 
} 

- (void)parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName { 

    if ([elementName isEqualToString: @"dateOfBirth"]) { 
     [theObject setDateOfBirth: currentString]; 
    } 

     // ... 
} 

现在的问题是,分配NSMutableString currentString这个对象是在这个地方危险的,因为它会被foundCharacters方法,因为它继续被修改在元素结束后查找字符。

这里的误解是,可变字符串在赋值给对象后不会被修改。

解决方案:当您确实不希望修改它时,即使您认为它不会被修改,也会从字符串中生成一个不可修改的字符串。

- (void)parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName { 

    NSString *parsedString = [NSString stringWithString:currentString]; // non-mutable copy made here 

    if ([elementName isEqualToString: @"dateOfBirth"]) { 
     [theObject setDateOfBirth: parsedString]; 
    } 

     // ... 
} 
+1

很好找,但你不需要那样做。 'dateOfBirth'是属性吗?任何时候你有一个NSString的属性,使它成为一个“复制”属性。这种类型是不可变的,但有一个可变子类的属性也是如此。 –

+0

好戏,谢谢! –

相关问题