解析xml时NSCFString appendString泄漏
问题描述:
我无法从我正在处理的iPhone应用程序中移除泄漏。我正在解析一个XML feed来获取数据。 这里是我使用的解析解析xml时NSCFString appendString泄漏
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSData *xml = [NSData dataWithContentsOfURL: [NSURL URLWithString:@"url link"]];
self.parser = [[NSXMLParser alloc] initWithData:xml];
[self.parser setDelegate:self];
[self.parser parse];
[self.parser release];
self.parser=nil;
代码和解析代码
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if(![elementName compare:@"item"])
{tempElement = [[XMLElement alloc] init];
}
else if(![elementName compare:@"title"])
{
self.currentAttribute = [NSMutableString string];
}
else if(![elementName compare:@"link"])
{
self.currentAttribute = [NSMutableString string];
}
else if(![elementName compare:@"comments"])
{
self.currentAttribute = [NSMutableString string];
}
else if(![elementName compare:@"pubDate"])
{
self.currentAttribute = [NSMutableString string];
}
else if(![elementName compare:@"category"])
{
self.currentAttribute = [NSMutableString string];
}
else if(![elementName compare:@"description"])
{
self.currentAttribute = [NSMutableString string];
}}
我正在泄漏每个
self.currentAttribute = [NSMutableString string];
和
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{NSString *strAppend = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([strAppend length] > 0) {
[self.currentAttribute appendString:string];
}
}
任何帮助表示赞赏。提前
感谢
答
非常感谢,但我没有调用我的对象类中的dealloc函数。添加此函数并释放所有使用[self.mystring释放]的字符串解决了问题
答
如果你的属性被保留,这样的:
@property (nonatomic, retain) NSXMLParser * parser;
......然后他们要保留的两倍。所以一个版本不会这样做。 你可以让他们开这样的:
NSXMLParser *tempParser = [[NSXMLParser alloc] initWithData:xml];
self.parser = tempParser;
[tempParser release];
然后做任何你需要self.parser。 然后在你的dealloc方法中,你释放它。由于这种方式是剩下1的保留计数(原ALLOC保持具有已发布了tempParser),一个版本应该这样做:
- (void) dealloc {
[parser release];
[super dealloc];
}
而且,我很困惑,为什么你会去的麻烦如果每个可能性具有相同的结果,则编写if-else语句。