iOS autorelease-pool-Blöcke
Ich war das Lesen der Dokumentation von apple über Speicher-management-wenn ich autorelease pool Blöcke und etwas gab mir zu denken.
Any object sent an autorelease message inside the autorelease pool block is
released at the end of the block.
Ich bin nicht sicher, ob ich voll verstehen. Jedes Objekt innerhalb einer autorelease-pool-block veröffentlicht wird am Ende des Blocks sowieso, denn das ist es Lebensdauer. Warum würden Sie brauchen, um Anruf autorelease an das Objekt, wenn es geht, erschien jedenfalls, wenn er erreicht das Ende des Blocks?
Klarer zu werden, werde ich ein Beispiel geben, von dem, was ich denke:
@autoreleasepool {
MyObject *obj = [[MyObject alloc] init]; //no autorelease call here
/* use the object*/
//....
//in the end it should get deallocated because it's lifespan ends, right?
//so why do we need to call autorelease then?!
}
PS: Bitte erzählen Sie mir nicht, weil der ARC, die wir nicht brauchen, einige Dinge zu tun, weil ARC kümmert sich um Sie. Ich bin mir voll bewusst, aber ich möchte zu verlassen, BOGEN beiseite nur für ein paar Momente, um zu verstehen, den Mechanismus der Speicher-management.
InformationsquelleAutor der Frage Teo | 2013-04-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Autorelease entfernt nur eine retain-count von dem Objekt, das es nicht "frei" ist der Speicher sofort wie in c ist. Wenn der autorelease-pool enden alle automatisch freigegeben Objekte mit einem Zähler von 0 haben, Ihre Erinnerung befreit.
Manchmal erstellen Sie eine Menge von Objekten. Ein Beispiel wäre eine Schleife, die Schaffung von neuen Saiten jedes mal, wenn es wiederholt und neue Daten werden Hinzugefügt, um den string. Sie können nicht auf die vorherigen Versionen der string und wollen, um Speicherplatz freizugeben, die von Menschen benutzt werden. Sie können dies erreichen, indem Sie explizit mit dem autorelease-pool, anstatt zu warten, für Sie natürlich gemacht werden.
InformationsquelleAutor der Antwort Kibitz503
(Meist nur einige zusätzliche hintergrund; @Kibitz503 ist bekommen Sie die richtige Antwort an.)
OK, lassen Sie uns nicht überlegen, ARC. In der oben, ohne BOGEN,
obj
würde nicht freigegeben werden. Nur weil ARC fügt zusätzlicherelease
Anrufe nicht möglicherweise bekommen freigegeben (dein Beispiel, haben wir eigentlich keine Idee, da wir nicht wissen, was passiert inuse the object
).Als @Kibitz503 erklärt, "release" bedeutet nicht "freigeben." Am Ende des Blocks, in den autorelease-pool entwässert, was bedeutet, dass alle ausstehenden
autorelease
Anrufe gesendet werden, alsrelease
am Ende des Blocks. Wenn, die führt, um das Objekt zu erreichen ein 0 retain-count, dann ist es freigegeben.Aber, ob die oben ist in einem block ist oder nicht, ohne BOGEN ist es ein Leck.
InformationsquelleAutor der Antwort Rob Napier
Autorelease-pools verschieben release des Objekts bis zum Ende der pool, das verhindert die Möglichkeit, daß er veröffentlicht wird, bevor es das Ende erreicht. Also im Grunde ist es, um sicherzustellen, dass das Objekt nicht freigegeben werden, bevor das Ende des Pools.
InformationsquelleAutor der Antwort anivader