/ / NSURLConnection Leak - iPhone, Objektiv-c

NSURLConnection Leak - iPhone, Ziel-c

Heute stand ich vor einem kleinen Problem, ich wollte den Grund der Undichtigkeit wissen. Hier ist der Code

[[NSURLConnection alloc] initWithRequest:request delegate:self];

Das funktioniert problemlos.

Jetzt habe ich mich nur gefragt, was mit diesem zugewiesenen Speicher / Objekt passiert, da niemand es freigibt. Ich habe also nach meinem Instinkt eine Autorelease gesetzt, während ich wie folgt allokierte:

[[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

Dies warf mich einen Fehler und Absturz "[NSURLConnectionInternalConnection _withConnectionDisconnectFromConnection]: Nachricht an freigegebene Instanz gesendet"

Ich wollte nur das Konzept und den Grund dahinter kennen.

EDIT: Ich benutze kein ARC.

Vielen Dank.

Antworten:

0 für die Antwort № 1

[NSURLConnectionInternalConnection _withConnectionDisconnectFromConnection]

Dies wurde nach dem Autorelease-Pool genannthat Ihr NSURLConnection-Verbindungsobjekt freigegeben. Am besten ist es, eine Referenz für die Variable zu haben und diese freizugeben, sobald Sie mit dem Abrufen der Daten fertig sind. (Kann in der viewDidUnload sein:?)


1 für die Antwort № 2

Ich denke, Sie können Autorelease hier nicht für eine bessere Speicherverwaltung verwenden. Geben Sie das Verbindungsobjekt in der Verbindungsdelegierungsmethode frei

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
{
[connection release];
}

Wenn Ihre Verbindung hergestellt ist, wird das Verbindungsobjekt freigegeben, oder Sie können es auch über viewDidUnload freigeben


0 für die Antwort № 3

Sie können diese Methode zur besseren Speicherverwaltung verwenden NSURLConnection * connection = [NSURLConnection connectionWithRequest: urlRequest delegate: self];

Über der connectionWithRequest-Methode befindet sich classmethode und verwalte den speicher selbst. du brauchst ihn nicht freizugeben. Soweit ich weiß, fügt objc runtime nach dem Zuweisen des Verbindungsobjekts das Objekt zu autoreleasepool hinzu, dann wird eine andere Delegatmethode an freigegebene Instanzen gesendet.