2014-12-05 216 views
1

我正在解析某個站點的一些rss提要,並且當我的代碼到達解析器的方法時,應用程序關閉時發現exc_bad_access錯誤。奇怪的是,當我在模擬器中運行我的應用程序時,應用程序運行沒有問題。這是我的解析代碼:xml解析器:解析器foundCharacters錯誤

#pragma mark NSXMLParser delegate 

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

if ([elementName isEqualToString:@"item"]) { 

    [item setObject:title forKey:@"title"]; 
    [item setObject:link forKey:@"link"]; 

    [feeds addObject:[item copy]]; 

} 

} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 

element = elementName; 

if ([element isEqualToString:@"item"]) { 

    item = [[NSMutableDictionary alloc] init]; 
    title = [[NSMutableString alloc] init]; 
    link = [[NSMutableString alloc] init]; 

} 

} 


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

if ([element isEqualToString:@"title"]) { 
    [title appendString:strings]; 
} else if ([element isEqualToString:@"link"]) { 
    [link appendString:strings]; 
} 

} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 

[self.tableView reloadData]; 
} 

我的錯誤顯示出來,當它到達的第一行:

if ([element isEqualToString:@"title"]) { 
    [title appendString:strings]; 
} else if ([element isEqualToString:@"link"]) { 
    [link appendString:strings]; 
} 

當我嘗試改變與這些線路,例如:

[title appendString:strings]; 

它運行完美,主要區別在於我沒有鏈接進入rss feed。 換句話說,問題似乎是檢查元素是否等於string @「title」。 謝謝。

+0

儘管這裏有問題,但我不確定爲什麼你會遇到訪問不良(除非你不使用ARC)。順便說一句,確保'didEndElement'將'element'變量設置爲'nil'在方法結束時(或者最終可能會在標題和鏈接值中出現意外的額外字符)。 – Rob 2014-12-05 16:04:45

+0

YES SIR !!!這是我的想法。我不明白爲什麼會發生這種情況。我已經將元素變量設置爲nil在didendelement中並且它可以工作。沒有錯誤。非常感謝你的靈感。 – user3882720 2014-12-05 16:12:05

回答

0

如果你不使用ARC,我肯定會期望訪問不良,在這種情況下,懸掛指針極有可能。

無論如何,我將確保didEndElementelement變量nil在方法結束(或者你可以在titlelink值與意外額外字符結束)。這也會減少您在didStartElement以外收到的elementName的附帶和不必要的引用,超出了您實際需要的範圍。個人而言,如果我打算使用傳遞給我的elementName超出該方法的範圍didStartElement,我傾向於將copy傳遞給我的值或使用其他狀態變量來跟蹤是否我解析的是titlelink或其他。