Frage

In Objective-C, wenn array1 auf array2 kopiert mutableCopy verwenden, und nehmen sie an wird der Code in main () durchgeführt, die zum Lösen der Objekte in dem Array enthaltenen verantwortlich? Ist es main () oder array2?

War es hilfreich?

Lösung

Ich denke, die bisherigen Antworten den Punkt verpasst haben, oder aber der Fragesteller war ziemlich unklar. Die eigentliche Frage spricht nicht über jeden Array, sondern der Inhalt des Arrays:

  

, die zur Freigabe der verantwortlich ist, Objekte in dem Array enthalten ? Ist es main () oder array2?

Sowohl array1 und array2 sind verantwortlich für die Objekte freigegeben wird.

Von den NSArray Dokumentation :

  

"Arrays starke Hinweise auf dessen Inhalt in einer verwalteten Speicherumgebung eingehalten wird, erhält jedes Objekt eine Nachricht beibehalten, bevor seine ID an das Array und eine Freigabenachricht hinzugefügt wird, wenn es aus dem Array oder wenn das Array entfernt wird Zuordnung aufgehoben wird. "

Um damit zu beginnen, jedes der Objekte wird durch den NSArray array1 beibehalten. Wenn Sie array2 über -mutableCopy erstellen, erhalten Sie eine NSMutableArray erhalten, die auf die gleichen Objekte zeigt, und behält wieder jeder von ihnen. Wenn Sie an dieser Stelle veröffentlichen array1 waren, als seine dealloc Methode aufgerufen wurden würde es jedem der Objekte loslassen enthält. Allerdings array2 hat sie beibehalten, so werden die Objekte nicht zerstört werden - nur dann, wenn ihre Beibehaltungszähler 0 erreicht, was passieren würde, wenn array2 zerstört wurden und niemand sonst hat eines der Objekte (oder nur, wenn sie von array2 entfernt).

Da Collection-Klassen (Arrays, Sets, Wörterbücher, etc.) Griff zu halten und deren Inhalte die Freigabe, alles, was Sie haben Grund zur Sorge ist Beibehaltung oder die Freigabe der Sammlung selbst. Da Sie -mutableCopy verwendet, denken Sie daran, dass Sie implizit array2 behalten haben, so sollten Sie es freigeben, wenn Sie mit ihm fertig sind.

Andere Tipps

I Referenz diese Anleitung für Speicherverwaltung in Obj-C. Er hat einen Abschnitt über Arrays und Wörterbücher, hier ein Auszug:

  

Arrays, Wörterbücher usw. behalten im Allgemeinen keine Objekte in ihnen hinzugefügt. (Wenn Sie mit 3rd-Party-Sammlung Art Objekte handelt, immer in der Dokumentation überprüfen, um zu sehen, ob sie behalten oder nicht). Das bedeutet, dass diese Sammlungen Besitz des Objekts nehmen, und Sie müssen nicht vor der Zugabe beibehalten müssen.

Die Kommentare für die Buchung auch nützlich sind,

Die Eigentum Verantwortlichkeit sind nicht durch das Speichern von Objekten in einem Array verändert. Hier ein Beispiel:

int main(int argc, char *argv[])
{
    // ...

    NSObject *obj1 = [[NSObject alloc] init]; // owned
    NSObject *obj2 = [[NSObject alloc] init]; // owned
    NSObject *obj3 = [[[NSObject alloc] init] autorelease]; // not owned

    NSMutableArray *array1 = [NSMutableArray arrayWithObjects: obj1, obj2, obj3, nil]; // not owned
    NSMutableArray *array2 = [array1 mutableCopy]; // owned

    // ...

    [array2 release];
    [obj2 release];
    [obj1 release];

    // ...
}

Dieser Code ordnet direkt obj1 und obj2, so dass er sie besitzt und müssen sie freilassen, aber es autoreleases obj3, so ist es nicht, dass zu lösen hat. In der gleichen Art und Weise, nicht besitzt es nicht das Ergebnis von arrayWithObjects:, so ist es, dass nicht freigibt, aber es das Ergebnis von mutableCopy nicht besitzt, so ist es, dass freigeben müssen. Die Objekte in einem Array gespeichert werden, ist irrelevant-alles, was Sie zu kümmern brauchen, um über das Eigentum ist.

Beide Arrays halten starke Hinweise auf deren Inhalt, so obj1, obj2 und obj3 wird nicht so lange wie die Arrays existieren, aber das ist ein Detail des NSArray Vertrag aufgehoben werden, wirkt sich nicht auf, wie Sie sich das Eigentum verwalten die Objekte oder die Arrays.

Dies sind alle Details der Cocoa Speicher-Management-Konventionen , nicht-Arrays.

Es wäre nicht sinnvoll, für ein veränderliches Array zu einem unveränderlichen Array gebunden werden. main () würde für die Freigabe array1 verantwortlich sein.

Nach meiner Erfahrung führt jedoch zu Objekten nur die Freigabe von Anwendungen zum Absturz bringen. ObjC ist ziemlich gut im Speicher automatisch verwalten. Meine Cocoa-Anwendungen scheinen nicht immer mehr Speicher benötigen, als sie mit begonnen, auch nach mehreren Stunden ausgeführt wird.

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