2011-08-23 32 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];