我已经设置了一个 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{
}
我知道这里遗漏了很多东西,但我正试图在继续之前阻止这种泄漏。它似乎以 currentElement = [elementName copy];
didStartElement 方法为中心。
最佳答案
在为currentElement分配一个新元素之前,您需要先释放前一个元素,否则旧元素将没有任何其他引用并且会被泄漏。所以你可以这样做:
[currentElement release];
currentElement = [elementName copy];
或者,您可以将 ivar currentElement 属性声明为副本,只需这样做:
//This releases previous value, and copies the new Value.
self.currentElement = elementName;
关于iphone - 我的 NSXMLParser 代码中的漏洞在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7080754/