我已经设置了一个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];
为中心。
答案 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都返回一个保留的对象,你需要释放它。