Objective C Release, Autofreigabe und Datentypen
-
10-07-2019 - |
Frage
Ich bin neu in dem Speicher verwaltetem Code, aber ich bekomme die Idee ziemlich gut.
Auf meine App durch die Lecks Werkzeug in XCode nehmen, bemerkte ich, ich musste nur meine benutzerdefinierten Objekte bereinigen, aber nicht dynamisch Arrays zum Beispiel erstellt, so dass ich dachte, diese Datentypen Autoreleased sind - macht Sinn, da hatte ich nur zu lassen sie die Arrays I als Eigenschaften verwendet, die ein (behalten) auf sie hatte.
Dann bemerkte ich etwas Besonderes: Ich war ein Leck an einem bestimmten Array wie folgt initialisiert bekommen:
NSMutableArray *removals = [NSMutableArray new];
aber nicht ein ähnliches
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:9];
Nun war der Grund, warum man mit „neuen“ eingerichtet ist, dass es 0-99 Elemente darin haben könnte, während der andere ich wusste, würde immer 9. sein, da beide Arrays auf die gleiche Methode übergeben werden später Interaktion mit dem Benutzer basierend auf, war ich entweder immer ein Leck, wenn ich nicht am Ende des Verfahrens freigegeben habe, oder eine Ausnahme, wenn ich!
Ich habe die erste Array
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];
und ich bekomme keine Lecks und muß nicht alles lösen. Kann mir jemand erklären?
Lösung
Wie bereits in der Speicher-Management-Regeln , wenn Sie ein Objekt, das Sie mit +alloc
erstellt haben, +new
, -copy
oder -mutableCopy
besitzen Sie es und sind verantwortlich für die es an einem gewissen Punkt freigibt. (In der Tat,
Andere Tipps
Dies ist, wie die Dinge hinter den Kulissen implementiert:
+(NSMutableArray*) new
{
return [[NSMutableArray alloc] init];
}
und
+(NSMutableArray*) arrayWithCapacity:(NSNumber)capacity
{
return [[NSMutableArray alloc] initWithCapacity:capacity] **autorelease**];
}
Im ersten Fall wird das Array nur zugewiesen, und Sie sind verantwortlich für die es de-Zuweisung. Im Gegenteil hat die arrayWithCapacity für Sie Autoreleased und wird nicht dazu führen Leck Sie sogar ausplanen vergessen.
Cocoa verwendet bestimmte Namenskonventionen. Alles, was mit alloc, neu, oder kopieren beginnt wieder etwas mit einem retainCount von 1, und Sie sind freizugeben erforderlich. Alles andere, die eine Funktion gibt einen ausgeglichenen retainCount hat (es könnte durch etwas anderes gehalten werden, oder es könnte beibehalten werden und aus freigegeben).
So:
NSMutableArray *removals = [NSMutableArray new];
Hat eine retainCount von 1, und:
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];
oder
NSMutableArray *removals = [NSMutableArray array];
Sie nicht, da die Verfahren nicht mit alloc, neuen oder Kopie vorangestellt. Dies alles wird in der Speicherverwaltung buchstabiert Dokumentation . Insbesondere gilt Folgendes:
Sie nehmen das Eigentum an einem Objekt, wenn Sie schaffen sie ein Verfahren, dessen Name mit beginnt mit „alloc“ oder „neu“ oder enthält „Kopie“ (zum Beispiel alloc, newObject oder mutableCopy), oder wenn Sie Bitte senden Sie eine Nachricht es behalten. Sie sind verantwortlich für den Verzicht auf Besitz von Objekten, die Sie besitzen mit freigeben oder Autorelease. Zu jeder anderen Zeit Sie ein Objekt erhalten, müssen Sie nicht loslassen.