Mise à jour: J'ai modifié le code, mais le problème persiste ...fuite de mémoire étrange iPhone dans l'analyseur XML
Salut tout le monde,
c'est mon premier post ici - j'ai trouvé cet endroit un grand ressource pour résoudre beaucoup de mes questions. Normalement, je fais de mon mieux pour résoudre tout seul, mais cette fois je n'ai aucune idée de ce qui ne va pas, alors j'espère que quelqu'un pourra m'aider.
Je suis la construction d'une application iPhone qui analyse quelques fichiers XML en utilisant TouchXML. J'ai une classe XMLParser, qui s'occupe du téléchargement et de l'analyse des résultats. Je reçois des fuites de mémoire lorsque j'analyse un fichier XML plusieurs fois avec la même instance de XMLParser. Voici l'un des extraits d'analyse syntaxique (seulement la partie pertinente):
for(int counter = 0; counter < [item childCount]; counter++) {
CXMLNode *child = [item childAtIndex:counter];
if([[child name] isEqualToString:@"PRODUCT"])
{
NSMutableDictionary *product = [[NSMutableDictionary alloc] init];
for(int j = 0; j < [child childCount]; j++) {
CXMLNode *grandchild = [child childAtIndex:j];
if([[grandchild stringValue] length] > 1) {
NSString *trimmedString = [[grandchild stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[product setObject:trimmedString forKey:[grandchild name]];
}
}
// Add product to current category array
switch (categoryId) {
case 0:
[self.mobil addObject: product];
break;
case 1:
[self.allgemein addObject: product];
break;
case 2:
[self.besitzeIch addObject: product];
break;
case 3:
[self.willIch addObject: product];
break;
default:
break;
}
[product release];
}
}
La première fois, je parse le code XML aucune fuite apparaît dans les instruments, la prochaine fois que je le fais, je me suis beaucoup de fuites (NSCFString/NSCFDictionary).
Instruments me dirige à l'intérieur cette partie CXMLNode.m, quand je creuse dans un objet de fuite:
theStringValue = [NSString stringWithUTF8String:(const char *)theXMLString];
if (_node->type != CXMLTextKind)
xmlFree(theXMLString);
}
return(theStringValue);
J'ai vraiment passé beaucoup de temps et ont essayé plusieurs approches pour résoudre ce problème, mais en vain jusqu'à présent , peut-être qu'il me manque quelque chose d'essentiel?
Toute aide est très appréciée, merci!
Merci beaucoup - qui était stupide de ma part. Malheureusement les fuites existent toujours, mais maintenant à l'intérieur de la classe CXMLNode.m à cette ligne: theStringValue = [NSString stringWithUTF8String: (const char *) theXMLString]; if (_node-> type! = CXMLTextKind) \t xmlFree (theXMLString); } return (theStringValue); – Chris
ah désolé, je ne pouvais pas obtenir le formatage correct ... – Chris
Hmmm ... qui ressemble plus à un avertissement d'une fuite possible, plutôt que d'un poireau garanti. Cela dit, je suis passé en revue la source pour CXMLNode dans TouchXML et je ne trouve pas cette ligne du tout ... quelle version du projet avez-vous, et sur quelle ligne est-il? Je note du groupe d'utilisateurs google TouchCode que l'auteur, Jonathan Wight, est assez bon pour répondre aux messages re: fuites de mémoire: http://groups.google.com/group/touchcode-dev –