2014-12-05 2 views
1

Я разбираю некоторые rss-каналы с сайта, и когда мой код достигает метода парсера foundCharacters, приложение закрывается с ошибкой exc_bad_access. Странно то, что когда я запускаю свое приложение в симуляторе, приложение работает без проблем. Это мой синтаксический анализ код:xml parser: parser foundCharacters error

#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-канал. Другими словами, проблема заключается в проверке, если элемент равен строке @ "title". Спасибо.

+0

Хотя здесь есть проблемы, я не уверен, почему вы получите плохой доступ (если вы не используете ARC). BTW, убедитесь, что 'didEndElement' устанавливает переменную' element' в 'nil'. В конце метода (иначе вы могли бы получить непреднамеренные дополнительные символы в значениях заголовка и ссылки). – Rob

+0

ДА SIR !!! это я думаю. И я не понимаю, почему именно это происходит. Я установил переменную элемента в nil в didendelement, и она работает.! Нет ошибки. Большое спасибо за ваше вдохновение. – user3882720

ответ

0

Я бы, конечно, ожидал плохой доступ, если вы не использовали ARC, и в этом случае свисающий указатель крайне вероятен.

Несмотря на это, я хотел бы убедиться, что didEndElement наборов element переменной nil в конце методы (или иначе вы можете в конечный итоге с непреднамеренными дополнительными символами в title и link значений). Это также минимизирует случайные и ненужные ссылки на elementName, полученные вами в didStartElement, за пределы того, что вам действительно нужно.

Лично, если бы я собирался использовать elementName переданный мне в didStartElement выходит за рамки этого метода, я был бы склонен либо copy значения, переданное мне или использовать какое-либо другое переменное состояние, чтобы отслеживать ли Я разбирал title или link или что-то еще.