Speicherleck gefunden mit Klirren aber kippen Release und Autorelease Abstürzen
-
20-09-2019 - |
Frage
ich eine Klasse, die einen Antrag auf ein paar übergebenen Variablen basiert aufbaut. Die Klasse hat auch alle die Delegatmethoden die Daten und speichert sie in einer Eigenschaft für die anrufende Klasse erhalten abgerufen werden.
Wenn die Klasse initialisiert sie erstellt eine Verbindung und kehrt dann selbst:
NSURLConnection *connection;
if (self = [super init]) {
self.delegate = theDelegate;
...some code here...
connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];
}
return self;
So kann ich es normalerweise nicht freigeben und wenn ich Autorelease stürzt. Ist es die Aufgabe der anrufenden Klasse zu veröffentlichen? Und wenn ja nicht nur das initilised Objekt Freigabe auch Release-Verbindung oder haben Sie es speziell veröffentlichen? Wenn ja, wie würden Sie?
Danke
Lösung
Make connection
eine Instanzvariable und geben sie bei Bedarf. Die Frage „wer“ das Objekt freigeben sollte, hängt streng auf Ihrem Objekt Semantik und Hierarchie.
Andere Tipps
Warum öffnen Sie ein NSURLConnection
in einem Konstruktor?
Normalerweise Konstruktor sollte diese Art von Arbeit nicht ausführen. Wenn die Verbindung mit dem Objekt verbunden ist, würde ich connection
eine Eigenschaft des Objekts und [connection release];
innerhalb des Objekts dealloc
Methode machen.
Beachten Sie, dass Sie nicht alle den Glauben an Clang platzieren sollte. Es kann und wird Bericht falsch-negative und falsch positive Ergebnisse.
Clang wird immer besser jeden Tag, aber es immer noch in den Kinderschuhen steckt jetzt. Es ist toll, dass es mit Xcode integriert ist so schön, aber nur im Kopf behalten, dass es einige Mängel hat.
In diesem Fall kommt es auf dem Umfang der Variablen, die Sie in das Verbindungsobjekt sind zu speichern. Wenn es als Instanz Variable deklariert ist, dann sollte es in Ordnung sein, so lange wie Sie es in dealloc veröffentlichen oder zu einem anderen Punkt, wenn Sie mit ihm fertig.
Wenn Sie, wie Sie in Ihrer Frage gepostet haben, die Deklaration von connection
auf Ihre init-Methode lokal ist, dann wird Clang Berichterstattung korrekt ein Leck. Sie sollten connection
eine Instanz Variable oder Eigenschaft machen und sicherzustellen, dass Sie es in dealloc freigeben oder wenn Sie mit ihm fertig sind.