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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top