2014-12-05 5 views
1

사이트에서 일부 RSS 피드를 구문 분석하고 있는데 내 코드가 파서 foundCharacters의 메서드에 도달하면 응용 프로그램이 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 피드를 입력 할 링크가 없다는 주요 차이점과 완벽하게 실행됩니다. 즉, 요소가 문자열 "@ title"과 같은지 검사 할 때 문제가있는 것 같습니다. 감사합니다.

+0

여기에 문제가 있지만 왜 ARC를 사용하지 않는 한 나쁜 액세스를 얻게 될지 잘 모르겠습니다. BTW,'didEndElement'가'element' 변수를'nil'으로 설정했는지 확인하십시오. 메소드 끝에서 (그렇지 않으면 제목과 링크 값에 의도하지 않은 여분의 문자가 생길 수 있습니다). – Rob

+0

YES SIR !!! 그게 내 생각 이었어. 그리고 나는 왜 이것이 정확히 일어 났는지 이해할 수 없다. didendelement에서 요소 변수를 nil로 설정했는데 작동합니다. 오류 없음. 영감에 감사드립니다. – user3882720

답변

0

ARC를 사용하지 않으면 나쁜 액세스가 예상됩니다.이 경우 매달린 포인터가 발생할 가능성이 큽니다.

에 관계없이, 나는 방법의 끝에 nil에 확인하십시오 didEndElement 세트 element 변수를 만들 것이다 (그렇지 않으면 당신은 titlelink 값에 의도하지 않은 추가 문자로 끝날 수 있음). 또한 didStartElement에 접수 된 elementName에 대한 우발적이고 불필요한 참조가 실제로 필요한 지점을 넘어서는 것을 최소화합니다.

elementName 개인적으로는 didStartElement에서 해당 메서드의 범위를 벗어나면 copy 값을 전달하거나 다른 상태 변수를 사용하여 추적 여부를 추적 할 수 있습니다. 나는 title 또는 link 또는 무엇이든을 파싱했다.