2012-04-11 9 views
0

Ich habe diesen Code von dieser Website herunterladen. http://homepages.ius.edu/rwisman/C490/html/nsxmlparser.htmReferenz gezählte Objekt wird verwendet, nachdem es freigegeben ist? NSXMLParser

Wie ich es analysiere. Ich habe Speicherlecks. Ich habe versucht, google alles von Autorelease, Sender, Null, [Parser setDelegate: [Top10Parser neu]], etc. Es funktioniert nicht.

Ich brauche Hilfe.

- (void) run: (id) param { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSXMLParser *parser = [NSXMLParser alloc]; 
    [parser initWithContentsOfURL: url]; 

[Parser setDelegate: self]; < - ("Referenzzählung Objekt verwendet wird, nachdem es Freigabe ist")

[parser parse]; 
    [parser release]; 

    if ([delegate respondsToSelector:@selector(parseDidComplete:)]) 
     [delegate performSelector:@selector(parseDidComplete:) onThread: thread 
         withObject: outstring waitUntilDone:NO]; 

    [pool release]; 
} 

Antwort

2

ändern diese beiden Linien:

NSXMLParser *parser = [NSXMLParser alloc]; 
[parser initWithContentsOfURL: url]; 

zu

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: url]; 

Für einige Denkschulen, +alloc gibt ein Objekt im Besitz zurück und die Init-Methoden fügen weder Eigentum hinzu noch entfernen sie es. Es ist richtiger - und es ist, wie der Analysator es behandelt -, an eine init-Methode zu denken, die eine Referenz auf dem Empfänger verbraucht und ein eigenes Objekt zurückgibt. Wenn Sie also eine init-Methode aufrufen, aber das Ergebnis nicht self zuweisen, wurde der Besitz, den Sie für self hatten, verbraucht, und Sie haben keinen Zeiger auf das neue Objekt im Besitz. Alle zukünftigen Verwendungen von self verwenden ein Objekt, das Sie nicht mehr besitzen.

Verwandte Themen