ARC und autorelease
autorelease wird verwendet, um für die zurückgegebenen Funktion-Objekt, damit der Anrufer nicht zu eigen machen und aufgerufene Version des Objekts in der Zukunft.
Jedoch, ARC fähig ist, zu zählen, Eigentum des Anrufers und lassen Sie ihn nach dem Gebrauch, das heißt, es kann Verhalten wie Smart Pointer in C++. Mit ARC, kann es loszuwerden, autorelease, weil autorelease ist nicht-deterministisch.
Dem Grund bitte ich für diese Frage ist, dass ich sehe das zurückgegebene Objekt ruft dealloc früher im ARC als non-ARC code. Dies führt mich zu glauben, dass ARC benehmen können wie die Smart-Pointer und kann autorelease nutzlos. Ist es wahr oder möglich? Das einzige, was ich denken kann autorelease Nützlichkeit ist im multip-thread oder Netzwerk-code, da es nicht einfach ist, zu zählen, den Besitz, wenn das Objekt vorbei.
Vielen Dank für Ihre Gedanken.
Hier ist der neue edit zu machen, die Sache klar:
mit autorelease
+ (MyClass*) myClass
{
return [[[MyCClass alloc] init] autorelease];
}
- doSomething
{
MyClass *obj = [MyClass myClass];
}
ARC:
+ (MyClass*) myClass
{
return [[MyCClass alloc] init]; //no autorelease
}
- doSomething
{
MyClass *obj = [MyClass myClass];
//insert [obj release]
}
So, wir brauchen wirklich nicht autorelease.
release
zu jedem enthaltenen Objekt, sobald an der Unterseite jeder Drehung der run loop.Ich sehe einige subtl Fehler in autorelease den zugehörigen code. Wenn der code-Aufruf ein Objekt, es ist tatsächlich "loslassen", aber der release erfolgt am Ende der botton jeder Drehung der run loop. Wenn der code Migration zu ACR, stürzt es ab. Der Grund dafür ist, dass die ARC verkürzen die Lebensdauer des Objekts.
Tut es das, aber das sollte keine Rolle spielen, es sei denn, Sie verwenden
weak
Referenzen, das sollte man immer lokal zu konvertieren strong
bevor Sie Sie verwenden.Es ist mein ganzer Punkt, schwachen und stark ist genug, um loszuwerden, autorelease mit ARC. Es ist das, was in C++.
möglich, Duplikat der Objective-C: Warum ist autorelease (@autoreleasepool) noch erforderlich, ARC?
InformationsquelleAutor user2573923 | 2013-07-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Autorelease als ein Mechanismus ist noch verwendet von BOGEN, ferner BOGEN zusammengestellt-code wurde entwickelt, um nahtlos zusammenarbeiten mit MRC zusammengestellt-code, so dass der autorelease Maschinen herum.
Erste, glaube nicht, dass in Bezug auf die Referenz zählt, aber in Bezug auf Beteiligung - so lange, wie es ist ein erklärtes Eigentumsrecht an einem Objekt dann das Objekt lebt, wenn es keine Beteiligung ist es zerstört. Im MRC erklären Sie Beteiligungsquote von über
retain
, oder Sie erstellen ein neues Objekt; und Sie verzichten auf Beteiligung durch die Verwendungrelease
.Nun, wenn eine aufgerufene Methode erzeugt ein Objekt und möchte zurück zu seiner Anrufer-der angerufene ist Weg also muss er verzichten, der Beteiligungsquote, und so muss der Aufrufer erklären, dass Ihre Beteiligung oder das Objekt zerstört werden kann. Aber es gibt ein problem, der angerufene beendet, bevor der Anrufer erhält das Objekt - also, wenn der Anrufer gibt seine Beteiligung das Objekt zerstört werden kann, bevor der Anrufer die chance hat, zu erklären, dass Ihre Zinsen - nicht gut.
Beiden Lösungen werden verwendet, um diese Adresse:
1) Die Methode deklariert ist, zu transfer Eigentum Interesse in der Rückgabewert der aufgerufenen Funktion an den Aufrufer - das ist das Modell für
init
,copy
usw. Methoden. Der angerufene nie benachrichtigt es den Verzicht auf seine Eigentumsrechte und der angerufene nie erklärt Eigentumsrechte - durch Vereinbarung der Anrufer braucht nur über die Beteiligung und die Verantwortung der Verzicht auf es später.2) Die Methode erklärt wird, um einen Wert zurückzugeben, in dem der Anrufer hat kein Eigentum Interesse, aber jemand anderes wird das halten einer Beteiligung an für einen kurzen Zeitraum - in der Regel bis zum Ende der aktuellen Schleife. Wenn der Anrufer will mit der return-Wert mehr als das ist, müssen erklären, dass Ihre eigene Beteiligung, aber sonst kann er sich verlassen auf jemand anderes mit einer Beteiligung und damit das Objekt bleiben um.
Die Frage ist, wer kann, dass "jemand" sein, wer verwaltet die Beteiligung? Es kann nicht sein, die aufgerufene Methode, wie Sie ist, um Weg zu gehen. Geben Sie die "autorelease pool" - dies ist nur ein Objekt, für das jemand kann die übertragung eines Geschäftsanteils zu, so wird das Objekt bleiben, um für eine Weile. Der autorelease-pool verzichtet auf seine Beteiligung an den alle Objekte übertragen, um es auf diese Weise, wenn Sie dazu aufgefordert werden - in der Regel am Ende der aktuellen Schleife.
Nun, wenn das oben keinen Sinn macht (z.B. wenn ich es zu erklären, klar), Sie können sehen, dass die Methode (2) ist nicht wirklich erforderlich, wie Sie könnte immer verwenden Sie die Methode (1); aber, und das ist eine entscheidende aber unter MRC-das ist eine Menge mehr Arbeit für die Programmierer - jeder Wert von einer Methode kommt mit einer Beteiligung, die verwaltet werden müssen, und verzichtet auf einige Punkt - erzeugt eine string nur ausgeben? Auch müssen Sie dann verzichten auf Ihr Interesse an dieser temporären string... So (2) das Leben viel einfacher macht.
Einer der anderen Seite, sind die Computer schnell Idioten, und zählen die Dinge und das einfügen von code zum Verzicht auf Eigentumsrechte im Namen der intelligente Programmierer ist etwas, das Sie gut dazu geeignet sind. Also ARC nicht müssen die auto-release-pool. Aber es macht einiges einfacher und effizienter, und hinter den kulissen BOGEN optimal nutzen - Blick in den assembler-output in Xcode und du wirst sehen, Aufrufe von Routinen, die mit Namen ähnlich "retainAutoreleasedReturnValue"...
Also du hast Recht, es ist nicht benötigt, jedoch ist es immer noch sinnvoll - aber unter den BOGEN können Sie (in der Regel) vergisst, dass es überhaupt existiert.
HTH mehr, als es wahrscheinlich verwirrt!
Informationen über "autorelasepool block" (@autoreleasepool{...})
InformationsquelleAutor CRD
Unterschied zwischen ARC und autorelease erklärt-code :
ARC :
Autorelease :
Grundsätzlich ARC funktioniert, sobald eine variable nicht mehr benutzt wird, in einem Bereich, während autorelease wartet, bis es erreicht die main-loop und ruft dann
release
auf alle Objekte im pool. ARC verwendet wird innen Umfang, autorelease verwendet wird außerhalb der Gültigkeitsbereich der Funktion.Was ich denke ist ARC ersetzen kann autorelease wie ein smart-Punkt. Sie brauchen nicht autorelease ein Objekt zurückgegeben, statt, wenn der Anrufer die Funktion aufrufen, ARC es behalten können. Nach der Aufrufer erfolgt mit dem Objekt, ARC einfach loslassen. Sie müssen nicht warten in der Zukunft. Es ist nicht-deterministisch und schlecht ist.
Objekte werden freigegeben, einige Zeit nach diesem würde ausreichen, obwohl, würden Sie nicht sagen?
Ja, genau. Vielleicht legen "am Ende der run loop-Zyklus".
Es ist vereinfacht, aber ich werde aktualisieren, meine Antwort
InformationsquelleAutor Tom van der Woerdt
Wenn autoreleased, wird es Hinzugefügt, um den autorelease-pool. Wenn der autorelease-pool ist abgelassen, die verzögerte Freisetzung durchgeführt werden. eine Funktion/Methode nicht brauchen, um wieder einen autoreleased-Objekt (z.B. es könnte ein ivar, die nicht erhalten eine behalten/autorelease-Zyklus).
Er hat die Potenzial. Es gibt keine Garantie. Das größte "problem" hier ist, dass der compiler nicht weiß/Pflege der memory-mechanik des zurückgegebenen Objekts zu einem beliebigen Anruf. Es können nicht davon ausgehen, wie ein Objekt zurückgegeben wird, da ARC ist eine neue Ergänzung, die älter als MRC. Dies ist wichtig, weil es macht die ARC-kompatible Programme mit den Programmen, die Sie verwenden die manuelle retain/release. Zum Beispiel, Stiftung.framework verwenden, ARC, oder es kann MRC verwenden, oder Sie können beide verwenden. Es kann auch call-in-APIs, die gebaut wurden, die mit älteren toolchains. So dies hat den Vorteil, halten Sie eine Tonne von bestehendem code nutzbar.
Gibt es eine Option, mit der ein Objekt wieder -- siehe CRD ' s Antwort (+1) über die Versammlung und die Aufrufe der compiler fügt durchführen Referenz-count-Operationen z.B.
retainAutoreleasedReturnValue
.In jedem Fall, es gibt keine Garantie, dass die Lebenszeiten werden immer im BOGEN. Ein Programmierer, der es versteht, die Ausführung Ihres Programms zu minimieren Leben und ref-count-Operationen, weil ARC hat strengere Leben und Eigentum Anforderungen.
In der Theorie, ich sehe nicht ein, warum autorelease-pools konnte nicht durchgeführt werden, Weg mit für ein neues system. Ich glaube allerdings, dass es zu viel bestehenden code, der abhängig von autorelease-pools zu heben, dass die Beschränkung -- ich denke, Sie würde brauchen, um die phase in eine neue ausführbare Datei-format (wie war der Fall mit ObjC Garbage Collection) und die überprüfung einer Tonne bestehender APIs und Programme für eine so bedeutende übergang erfolgreich zu sein. Auch, ein paar APIs würde wahrscheinlich, müssen entfernt werden. APIs kann einige stärken in Bezug auf den Besitz, um dies zu erreichen, aber die meisten, die vollständig in Programme, die bereits migriert wurden, um ARC. Was solls, der compiler könnte (erweitert werden) intern eine form von smart-Pointern für die übergabe und Rückgabe objc-Typen und autorelease pools beseitigt werden könnten in einem solchen system. Wieder erfordern würde, dass eine Menge code migriert werden. So ein upgrade wäre wie ein ARC V2.
Kein Problem - autorelease-pools thread-lokalen. Ich sehe nicht ein Problem ist darüber hinaus, dass in einem solchen system (es sei denn, Sie verlassen sich auf eine race-condition, die offensichtlich eine schlechte Idee).
InformationsquelleAutor justin
autorelease
noch unter ARC. ARC macht den call für Sie und ist clever zu Kurzschluss. Hier ist eine demonstration , wie genau das funktioniert, das werde ich kopieren Sie hier für den Fall, dass blog-post immer verschwindet; alle fälligen Kredit von Matt Galloway.Ja, wo sehe ich ", wenn der sekundäre Benutzer nur Kopien, so viel wie notwendig ist, um seine oder Ihre beabsichtigte Nutzung". Der Verwendungszweck ist hier die Frage zu beantworten umfassend. Welcher Teil der oben genannten ist eindeutig unnötig? Sollte die Frage Fragesteller damit einverstanden ist, werde ich sicherlich entfernen Sie das Teil.
Heh. Ich habe gerade per E-Mail, die ihn über seine Website als gut. Also ich bin sicher, wir können, lassen Sie diese Bearbeitungen Matt für notwendig erachtet wird, erfüllen Sie so gut?
Hey Jungs. Josh - vielen Dank für den Hinweis, aber keine Sorge, Alex - ich weiß t mind. Vielleicht nur ein link hätte ausgereicht, anstatt copy & einfügen. Aber du hast Attribut, so es ist alles gut. Froh, dass Sie den Artikel nützlich finden, in den ersten Platz. Josh - vielen Dank für die Sorge. Es machte mir klar, dass ich eine Lizenz brauche, auf meine Website, um Sie ausdrücklich als das, was ich Erlaube. Ich werde es machen, frei zu verwenden, voll und ganz, aber erfordern die Namensnennung.
InformationsquelleAutor Alex Curylo
Verwechselst du ARC mit reference counting. Objective-C hat immer stützte sich auf der Referenzzählung zur Speicherverwaltung. ARC setzt diese tradition Fort und einfach beseitigt die Notwendigkeit für den Programmierer manuell einfügen, entsprechende Anrufe zu
-retain
,-release
, und-autorelease
. Unter der ARC-compiler fügt diese Anrufe für Sie, aber die reference-counting-Mechanismus bleibt der gleiche wie immer schon.ARC hat nicht beseitigen die Notwendigkeit für autorelease, aber es kann in der Lage sein, es zu vermeiden in Situationen, wo ein Mensch würde in der Regel Sie verwendet haben.
InformationsquelleAutor Caleb