2013-01-31 52 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

好戲,謝謝! –

相關問題