Проблемы с утечкой XMLParser - PullRequest
       22

Проблемы с утечкой XMLParser

0 голосов
/ 02 августа 2010

Я уже некоторое время пытаюсь сделать работающий xml-парсер свободным и эффективным, но пока безуспешным.Я удалил дополнительные поля, так как они все одинаковые.

- (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 Ответ

1 голос
/ 02 августа 2010

Если вы объявили свойства для своих иваров, я бы порекомендовал их использовать. Это облегчает управление памятью. Вот как бы я написал ваш код:

- (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;
}

Возможно, вы также захотите попробовать Build & Analyze для своего кода. это может указывать, где вы протекаете.

...