2011-08-16 38 views
0

我已經建立了一個NSXMLParser來解析通過Twitter的飼料,但我得到內存泄漏,坐在通過使用儀器大約一百次後,我無法弄清楚它在哪裏!下面是我的NSXMLParser代碼,它解析ASIHTTPRequest接收數據的時間。我的NSXMLParser代碼中的泄漏在哪裏?

-(void)ProcessAndParse{ 

    NSURL *url = [config urlForFeed:@"Twitter"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 

} 

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    NSData *responseData = [request responseData]; 
    myparser = [[NSXMLParser alloc] initWithData:responseData]; 
    [myparser setDelegate:self]; 
    [myparser setShouldResolveExternalEntities:YES]; 
    [myparser parse]; 



} 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    currentElement = [elementName copy]; 
} 

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 


} 

-(void)parserDidEndDocument:(NSXMLParser *)parser{ 


} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 




} 

我知道這裏有很多缺失,但我試圖在繼續之前停止泄漏。它似乎圍繞着didStartElement方法中的currentElement = [elementName copy];

回答

2

在爲currentElement指定一個新元素之前,您需要釋放前一個元素,否則舊元素將不會有任何其他引用並且會被泄漏。所以,你可以這樣做:

[currentElement release]; 
currentElement = [elementName copy]; 

或者你可以宣佈你的伊娃currentElement財產副本,並簡單地做到這一點:

//This releases previous value, and copies the new Value. 

self.currentElement = elementName; 
+0

currentElement是一個ivar,爲了讓這個我必須設置一個@property?用什麼參數? – MrPink

+0

這似乎工作.... – MrPink

+0

或者,也可以使用關鍵字保留該屬性,並刪除副本。不能真的把所有的代碼放在評論中,所以我添加了一個答案。 – Perception

0

看起來你是在didStartElement分配的currentElement內存,但是我不」不要在任何地方釋放它。它也看起來像你正在分配內存的解析器,但不釋放請求已完成

0

該代碼似乎不完整。要採取刺傷在黑暗中,不過,我看到兩個分配和釋放無:

myparser = [[NSXMLParser alloc] initWithData:responseData]; 

和...

currentElement = [elementName copy]; 

無論是ALLOC返回保留的對象,你就需要釋放。

+0

好myparser我應該釋放在dealloc? – MrPink

1

根據您在奧斯卡的回答中的意見,您有currentElement作爲您的委託類的屬性。我看到你的代碼的兩個問題:


你正在創建一個XML解析器,從不釋放它。爲了解決這樣做:

myparser = [[[NSXMLParser alloc] initWithData:responseData] autorelease]; 

您泄漏currentElement財產。爲了解決這樣做:

在你的頭文件,確保您的財產與保留關鍵字

@property (nonatomic, retain) NSString * currentElement; 

定義在你的執行文件,請正確使用你的財產

self.currentElement = elementName; 

的那應該解決所有問題。