2010-08-02 60 views
0

我一直在嘗試一段時間來讓xml解析器工作泄漏免費且高效,但迄今不成功。我刪除了其他字段,因爲它們都是一樣的。泄漏XMLParser的問題

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
    currentElement = [[elementName copy] autorelease]; 
    if ([elementName isEqualToString:@"source"]) { 
     if (!currentID) { 
      overlays = [[NSMutableArray alloc] init]; 
      currentID = [[NSMutableString alloc] init]; 
     } else { 
      [currentID release]; 
      currentID = nil; 
      currentID = [[NSMutableString alloc] init]; 
     } 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    if ([elementName isEqualToString:@"source"]) { 
     overlay = [[NSMutableDictionary alloc] init]; 
     [overlay setObject:currentID forKey:@"id"]; 
     [overlays insertObject:overlay atIndex:[overlays count]]; 
     [overlay release]; 
     overlay = nil; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
    string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 
    string = [string stringByReplacingOccurrencesOfString:@"\t" withString:@""]; 
    if ([currentElement isEqualToString:@"id"]) { 
     [self.currentID appendString:string]; 
    } 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    [currentID release]; 
    currentID = nil; 
    //[self addResources]; 
} 

任何幫助,將不勝感激。

回答

1

如果你已經爲你的ivars聲明瞭屬性,我會推薦使用它們。這使內存管理更容易。這是我會怎麼寫代碼:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
    self.currentElement = elementName; 
    if ([elementName isEqualToString:@"source"]) { 
     if (!self.currentID) { 
      self.overlays = [NSMutableArray array]; 
      self.currentID = [NSMutableString string]; 
     } else { 
      self.currentID = [NSMutableString string]; 
     } 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    if ([elementName isEqualToString:@"source"]) { 
     [self.overlays addObject: 
     [NSDictionary dictionaryWithObjectsAndKeys:self.currentID,@"id",nil]]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
    string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 
    string = [string stringByReplacingOccurrencesOfString:@"\t" withString:@""]; 
    if ([self.currentElement isEqualToString:@"id"]) { 
     [self.currentID appendString:string]; 
    } 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    self.currentID = nil; 
} 

你可能也想嘗試建立&分析你的代碼。這可能會指出你在哪裏泄漏。

+0

如果我可以投你10倍,我會。我曾嘗試使用靜態分析儀,但在我的項目中,沒有發現任何有泄漏的地方發現泄漏,並在沒有泄漏的地方發現泄漏。去搞清楚。 – Rudiger 2010-08-02 23:19:00