Wer ist verantwortlich für Objekte in einem Array freizugeben, wenn das Kopieren?
-
23-08-2019 - |
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?
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.