HILFE: Memory Leak(s) bei XMLParser und UIScrollView

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • HILFE: Memory Leak(s) bei XMLParser und UIScrollView

    Hi zusammen,

    ich find einfach nicht die Leaks bei meinem XMLParser und bei meinem UIScrollView, vll. seht ihr hier auf anhieb was
    schlimmes:

    XMLController:

    hier taucht der Fehler bzw. das Leck in der loadXMLbyURL Methode auf, er deutet auf den alloc von parser und sagt 100%
    .m:

    Quellcode

    1. --(id) loadXMLbyURL:(NSString *)urlString{
    2. table = [[NSMutableArray alloc] init];
    3. NSURL *url= [NSURL URLWithString:urlString];
    4. parser = [[[NSXMLParser alloc] initWithContentsOfURL:url]autorelease];
    5. parser.delegate = self;
    6. [parser parse];
    7. return self;
    8. }
    9. -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)
    10. namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    11. {
    12. if([elementName isEqualToString:@"game"])
    13. {
    14. [currentNodeContent setString:0];
    15. currentTabelle = [ErgebnisInput alloc];
    16. currentNodeContent = [[NSMutableString alloc]init];
    17. }
    18. }
    19. -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)
    20. namespaceURI qualifiedName:(NSString *)qName
    21. {
    22. NSString *theContent = [currentNodeContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //
    23. [currentNodeContent setString:@""];
    24. if([elementName isEqualToString:@"gamedate"])
    25. {
    26. currentTabelle.gameDate = theContent;
    27. }
    28. if([elementName isEqualToString:@"home"])
    29. {
    30. currentTabelle.homeTeam = theContent;
    31. }
    32. if([elementName isEqualToString:@"away"])
    33. {
    34. currentTabelle.awayTeam = theContent;
    35. }
    36. if([elementName isEqualToString:@"result"])
    37. {
    38. currentTabelle.result = theContent;
    39. }
    40. if([elementName isEqualToString:@"game"])
    41. {
    42. [table addObject:currentTabelle];
    43. [currentTabelle release];
    44. currentTabelle = nil;
    45. [currentNodeContent release];
    46. currentNodeContent = nil;
    47. }
    48. }
    49. -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    50. {
    51. //currentNodeContent = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    52. [currentNodeContent appendString:string];
    53. }
    54. @end
    55. }
    Alles anzeigen



    in der .h hab ich den parser ganz normal mit ner property.

    .h:

    Quellcode

    1. @interface XMLController : NSObject {
    2. NSMutableString *currentNodeContent;
    3. NSMutableArray *table;
    4. NSXMLParser *parser;
    5. Tabelle *currentTabelle;
    6. }
    7. @property (nonatomic, retain) NSMutableArray *table;
    8. -(id) loadXMLbyURL:(NSString *)urlString;
    9. @end
    Alles anzeigen



    und bei meinem ScrollView zeigt er mir in der loadScrollViewWithPage einen Leck:

    LoadScrollViewWithPage:

    Quellcode

    1. // add the controller's view to the scroll view
    2. if (nil == controller.view.superview) {
    3. CGRect frame = scrollView.frame;
    4. frame.origin.x = frame.size.width * page;
    5. frame.origin.y = 0;
    6. controller.view.frame = frame;
    7. [scrollView addSubview:controller.view];
    8. }



    in Zusammenhang zu beiden Problemen entsteht dann folgendes Leck
    bzw. hier teilt er mir ein 50% leck mit:

    Quellcode

    1. self.xmlcont = [[[XMLControllerErg alloc] init] autorelease];if(pageNumber == 0){
    2. [xmlcont loadXMLbyURL:@"page1.xml"];
    3. } if(pageNumber == 1){
    4. [xmlcont loadXMLbyURL:@"page2.xml"];




    Bitte helft mir, ich seh einfach nicht warum er hier das Leck hat, da ich alles release (so glaube ich zumindest)


    Vielen vielen Dank für eure Hilfe.


    Peter
  • ich greif über die property von table von anderen Klassen zu.

    ich habe jetzt schon öfter gelesen, dass das Problem anscheinend bei Xcode 4 bekannt ist und viele
    das ganze mit NSData machen und dann beim XMLParser mit ContentsOfData, aber da bekomme ich keine
    ergebnisse geladen.

    wenn ich jedoch die table über die Property mit autorelease steuere, stürzt mir mein app ab :(.
  • ich hab das jetzt so geschrieben:

    Quellcode

    1. parser = [NSXMLParser alloc];
    2. [parser initWithContentsOfURL:url];
    3. parser.delegate = self;
    4. [parser setShouldProcessNamespaces:NO];
    5. [parser setShouldReportNamespacePrefixes:NO];
    6. [parser setShouldResolveExternalEntities:NO];
    7. [parser parse];
    8. [parser setDelegate:nil];
    9. [parser release]
    Alles anzeigen



    leak kommt nach wie vor, liegt das jetzt an dem was du grad gesagt hast, dass der parser fertig is?
    Eigtl. sollte es doch so funktionieren?!
  • okay, also [parse parser] wird ganz normal vor der parserDidEndDocument aufgerufen.


    Is das so richtig? Wenn ja (was ich grad nicht glaube) dann hab ich das Leak nach wie vor!


    Quellcode

    1. -(void) parserDidEndDocument:(NSXMLParser *)nparser { [nparser release]; }


    der retain count vom parser ist nach dem release von parserdidend immer noch auf 1, der von table auch :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pretime ()

  • Ja, -parse ist synchron (sprich: Die Methode wird erst beendet, wenn auch das Parsen beendet ist, sonst könnte die Methode ja kaum den Erfolg des Parsens zurückgeben). Auf keinen Fall den Parser in irgend einem Callback releasen, sondern (wie in Deinem Code) danach. Pack' den Parser nicht in eine property, sondern in eine lokale Variable in der Methode.
    Multigrad - 360°-Produktfotografie für den Mac