我的NSXMLParser代码泄漏在哪里?

时间:2011-08-16 15:27:43

标签: iphone objective-c ios cocoa-touch nsxmlparser

我已经设置了一个NSXMLParser来解析Twitter提要,但是我得到了内存泄漏,并且在使用了大约一百次的仪器之后我无法弄清楚它在哪里!下面是我的NSXMLParser代码,它在ASIHTTPRequest接收数据时解析。

-(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];为中心。

4 个答案:

答案 0 :(得分:2)

在为currentElement分配新元素之前,您需要释放前一个元素,否则旧元素将不会有任何其他引用,它将被泄露。所以你可以这样做:

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

或者,您可以将ivar currentElement属性声明为副本,只需执行以下操作:

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

self.currentElement = elementName;

答案 1 :(得分:1)

根据您在Oscar答案中的评论,您将 currentElement 作为委托类的属性。我在你的代码中看到两个问题:


您正在创建XML解析器并且永远不会释放它。要解决这个问题:

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

您正在泄露 currentElement 属性。要解决这个问题:

在头文件中,确保使用retain关键字

定义属性
@property (nonatomic, retain) NSString * currentElement;

在您的实施文件中,正确使用您的属性

self.currentElement = elementName;

这应解决所有问题。

答案 2 :(得分:0)

看起来你在didStartElement中为currentElement分配内存,但我没有看到你释放它的任何地方。它看起来像是为解析器分配内存但不在requestFinished中释放它

答案 3 :(得分:0)

代码似乎不完整。然而,为了在黑暗中进行刺杀,我看到两个分配而没有释放:

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

和...

currentElement = [elementName copy];

alloc都返回一个保留的对象,你需要释放它。