Memory Leak NSURL

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

  • Memory Leak NSURL

    Hallo,
    es gibt zwar schon ein Thema zu Memory Leaks mit NSURL, aber das hat mir leider nicht weiter geholfen.
    Ich will einen NSMutableString nutzen um eine NSURL zu erstellen. Dazu tue ich folgendes:

    Quellcode

    1. //link ist vom Typ NSURL*
    2. //stringForUri ist vom Typ NSMutableString
    3. currentRssItem.link = [NSURL URLWithString:stringForUri]; //is leaking


    Es handelt sich um einen Parser, daher wird diese Zeile oft aufgerufen - dementsprechend erzeugt es ein gehöriges Memory Leak... Ursprünglich war meine Vermutung, dass stringForUri leakt, aber ich kann den Fehler einfach nicht finden. Hier einmal die Zeilen, in dennen ich mit stringForUri arbeite:

    Quellcode

    1. //Beginn des Parserelements
    2. stringForUri = [NSMutableString stringWithCapacity:30 ]; //autoreleased
    3. [stringForUri setString:@""];
    4. //Found Characters
    5. [stringForUri appendString:[NSString stringWithFormat:@"%@",cleanString]];
    6. //Ende des Elements
    7. currentRssItem.link = [NSURL URLWithString:stringForUri];


    Habe ich etwas entscheidendes übersehen?
    Ich wäre sehr dankbar für Eure Hilfe!

    Viele Grüße,
    Juji
  • Das sieht erstmal gut aus. So ganz glaube ich aber nicht an einen Leak in NSURL. Du könntest mal probieren, ob der Leak auch auftritt, wenn Du den Mutablestring in einen String umwandelst:

    Quellcode

    1. currentRssItem.link = [NSURL URLWithString:[[stringForUri copy] autorelease]];


    Aber wie schon angemerkt, brauchst Du wirklich einen Mutablestring?
    „Meine Komplikation hatte eine Komplikation.“
  • Hallo scriptedSheep,
    Dachte ich auch zuerst, aber wenn der Parser über das Dokument läuft,dann parst er nicht immer ein vollständiges Element zwischen den <element> ... </element>-Tags. Gerade bei Sonderzeichen macht er dann einen Bruch und parst mit einem erneuten Aufruf der Found-Characters-Methode weiter. Das heißt, ich muss mir den stringForUri aus den einzelnen Teilen zusammensetzten. und wenn dann das Endelement kommt </element> dann ist stringForUi fertig und ich kann in in link-element speichern...
  • Hallo,
    also jetzt bin ich gänzlich verwirrt. Ist mein Instruments-Leaks kaputt?

    Ich habe nun stringForUri als NSString gewählt und mal deine Zeile, scripptedSheep, benutzt, sowohl diese als auch die Zuweisung zur URL leaked... Der Code sieht dann ja folgendermaßen aus:

    Quellcode

    1. //Beginn Tag
    2. stringForUri = [NSString stringWithFormat:@"" ]; //autoreleased
    3. //Found Charakter
    4. // trim the string to remove whitespaces like blanks and line feeds
    5. //string > NSString*
    6. NSString* helpstring = [NSString stringWithFormat:@"%@",[string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]];
    7. NSString* cleanString = [NSString stringWithFormat:@"%@",[helpstring stringByReplacingOccurrencesOfString:@"\n" withString:@" " ]];
    8. stringForUri = [NSString stringWithFormat:@"%@%@",stringForUri,cleanString];
    9. // End Tag
    10. currentRssItem.link = [NSURL URLWithString:stringForUri];
    Alles anzeigen


    Ich habe gerade noch mal die speicheraddressen von cleanString, stringForUri, etc angeschaut, aber es sind alles unterschiedliche. Und alles ist Autoreleased...
  • Jup, habe ich schon gemacht. Ich habe auch schon NSZombieEnabled mitlaufen lassen, falls mir was abstützt.
    Bei Instruments lasse ich mir dann den Call Tree der Leaks anzeigen, mit Invert Call Tree und Hide System Libaries. Ich zweifle gerade an der ordnungemäßen Nutzung ;)
  • Hey,
    ich habe da jetzt noch mal ne Frage. Ich habe die Zeile jetzt folgendermaßen umgeschrieben

    Quellcode

    1. NSString * copy = [NSString stringWithString:stringForUri];
    2. currentRssItem.link = [[NSURL alloc] initWithString:copy];


    Nun wird mir nur [NSURL alloc] unterstrichen. Bedeutet dies, dass nur dieser Teil leaked? Oder leaked trotzdem die ganze Zeile?
    Ich gebe später currentRSSITem.link wieder frei.

    Danke,
    Juji
  • Wenn link ein retain property ist dann hast du hier einen doppelten retain (einmal den von alloc/init und einmal den des link selber) Beim Freigeben des link wird aber nur einer freigegeben. Du hast also ein leak. In dem Fall must du entweder

    Quellcode

    1. link=[[NSURL alloc] initWithString:copy];


    oder schöner


    Quellcode

    1. currentResItem.link=[[[NSURL alloc] initWithString:copy] autorelease];


    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Hallo,
    Ja, der Link ist ein retain Property. Ich habe nun das Autorelease angefügt und habe deutlich weniger Leaks ;)
    Wenn ich die Klasse SimpleRSSContent (von diesem Typ ist currentRSSItem) intialisiere, reserviere ich keinen Speicher für den link und gebe daher nichts frei beim dealloc.

    Trotzdem ist mir etwas schleierhaft, warum NSString * copy = [NSString stringWithString:stringForUri]; leaked. Hier wird mit wieder der rechte Teil der Zuweisung unterstreichen. Nebenbei: gibt die Unterstreichung einen Hinweis auf die genaue Position des Leaks?

    Danke!
  • also das stringWithString leaked definitiv nicht. Das muss was anderes sein. Wenn Du magst kannst Du mir das Projekt gerne mal kurz schicken und sehe mal drüber. Manchmal ist man ja auch einfach betriebsblind und ich habe eh gerade Feierabend gemacht und bereits mich auf meinen Urlaub morgen vor. :)

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)