2011-08-23 79 views
0

我得到EXC_BAD_ACCESS在解析XML文件在我Xcode4 iPhone应用程序EXC_BAD_ACCESS用的NSXMLParser

虽然我在这里读了很多类似的错误问题,但无法弄清楚如何修复我的代码!

坠毁在[解析器解析]

然后我启用NSZombieEnabled并得到了以下错误:

*** -[CFString appendString:]: message sent to deallocated instance 0x588c3a0 

以下是我的代码相关分析部:

-(void)openXML { 
    NSURL *url = [NSURL URLWithString:@"http://localhost/news.xml"];  
    NSURLRequest *req = [NSURLRequest requestWithURL:url]; 
    NSURLConnection *con = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
    [con release]; 
} 

-(void)parseXMLData:(NSData *)xmlData{ 
    parser = [[NSXMLParser alloc] initWithData:xmlData]; 
    parser.delegate = self; 
    [parser parse]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{  
    xmlDocument = [[NSMutableData alloc] init]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [xmlDocument appendData:data]; 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    [self parseXMLData:xmlDocument]; 
} 

- (void)parserDidStartDocument:(NSXMLParser *)parser{ 
    [offersData removeAllObjects]; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
    completeString = [[NSMutableString alloc] init]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    [offersData addObject:completeString]; 
    [completeString release]; 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
    [completeString appendString:string]; 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser{ 
    [offersTableView reloadData]; 
} 

回答

1

该消息表示代码正试图调用字符串对象上的方法(意味着它不是零),但对象已被释放(释放)。

didEndElement中,您正在发布completeString,但未将其设置为nil。这使得你得到的错误成为可能。

什么是可能发生的是didEndElement后,foundCharacters获取调用didStartElement(也许有像标签之间的新行一些空白),所以completeString仍在释放导致崩溃。

做完[completeString release];之后,也将其设置为nil,因此在重新分配之前可能对其执行的任何方法调用都不会崩溃。

如果completeString不是nil(这可能发生取决于xml标签是如何嵌套的),那么只需要执行addObject也是个好主意。

所以尝试改变didEndElement到:

if (completeString != nil) { 
    [offersData addObject:completeString]; 
} 
[completeString release]; 
completeString = nil; 
+0

I现在正在工作,但只有当XML有1个元素和子元素时,如果我再添加1个元素则不解析:/ – DeZigny

+0

请发布一个导致问题的xml小样本,并更详细地解释它如何不起作用如果崩溃什么是错误和什么行等)。 – Anna

+0

我发现了这个问题,但不知道为什么!在导致此问题的元素之一中存在“&”符号,只要我删除,我就可以正确获取所有XML数据! – DeZigny

0

如果u合成completeString然后u有自带点来电保留

改变这种

completeString = [[NSMutableString alloc] init]; 

self.completeString = [[NSMutableString alloc] init];