我正在从站点解析一些rss源,当我的代码到达解析器的findCharacters方法时,应用程序以exc_bad_access错误关闭。奇怪的是,当我在模拟器中运行我的应用程序时,应用程序运行没有问题。这是我的解析代码:
#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 :(得分:0)
如果你不使用ARC,我当然会期待一个糟糕的访问,在这种情况下,极有可能是悬空指针。
无论如何,我会确保didEndElement
在方法结尾处将element
变量设置为nil
(否则您可能会在title
中出现意外的额外字符}和link
值)。这也最大限度地减少了您在elementName
中收到的didStartElement
的偶然和不必要的引用,超出了您实际需要的范围。
就个人而言,如果我打算使用超出该方法范围的elementName
传递给我的didStartElement
,我倾向于copy
传递给我的价值或使用其他一些状态变量来跟踪我是在解析title
还是link
或其他什么。