2016-03-09 7 views
8

Mein Wissen über ARC wurde heute getestet, ich stolperte über this article und es hat ein Beispiel unter der Überschrift "Nesting of Statements", die meiner Meinung nach falsch scheint.Behält ARC Objekte innerhalb eines Methodenparameters reserviert

example

Im Beispiel oben sie eingebettet zeigen, sagt die Zeile markiert mit einem grünen unterstrichen, dass die Zeichenfolge innerhalb der Funktion alloced zuerst eine +1 Zählung beibehalten bekommen würden, wenn, +1 wieder dann erstellt werden, wenn das Hinzufügen Wenn das Array nach der for-Schleife nicht mit dem Array verbunden ist, wird der Retain-Zählerstand des Strings um 1 reduziert, sodass der ursprüngliche String mit einem Retain-Zählerstand von 1 zurückbleibt und nicht freigegeben wird.

ich den Compiler angenommen hätte würde klug genug, um zumindest gewesen zu einem Objekt, dass wie nicht wirklich eine Zählung zunächst behalten haben, denn wenn Sie nur

[[NSString alloc] initWithFormat:@"Name 1"]]; 

haben diese Saite nichts hätte alloced werden zeigt darauf und würde freigegeben, wenn der Autorelease-Pool zu einem Ende kommt, anstatt für immer eine Retain-Anzahl von 1 zu haben. Warum sollte es ein anderes Verhalten haben, wenn es in einem Parameter einer Funktion ist? (es sei denn, diese Zeile hat eine Retain-Zahl von 1 und dies ist irgendwie ein Speicherleck? andernfalls könnte sie eine Retain-Zählung von 1 bis zum Ende ihres Bereichs haben, aber dann würde diese Logik gelten, wenn sie ebenfalls ein Parameter ist Ich würde annehmen)

Ist dieser Artikel falsch oder ist mein Verständnis von ARC fehlerhaft?

+0

Artikel ist falsch. Und warum sie "alloc init" weiterhin anzeigen, während wir bequeme Methoden für Methodenbereiche verwenden ... Seltsam. –

+2

Der Artikel ist falsch (wie unten angegeben). Sie finden die Details unter http://clang.llvm.org/docs/AutomaticReferenceCounting.html#retetained-return-values: * "Wenn ARC den Rückgabewert einer solchen Funktion oder Methode zurückgibt, gibt ARC den Wert bei Ende des Full-Expressions ist es enthalten, vorbehaltlich der üblichen Optimierungen für lokale Werte. "* - Sowohl' name = nil' als auch 'array = nil' sind nicht erforderlich, um" ARC release memory "zu unterstützen. –

Antwort

5

Der Artikel ist falsch.

Ihr Verständnis ist im Wesentlichen korrekt, obwohl der Autorelease-Pool in diesem Fall nicht verwendet wird. Der Unterausdruck:

[[NSString alloc] initWithFormat:@"Name 1"]]; 

gibt ein Objekt im Besitz, wie alle init Methoden. Dieses Objekt wird an übergeben und das Array übernimmt auch das Eigentum. Danach sieht ARC, dass die Zeichenfolge von der Methode nicht mehr benötigt wird, und gibt ihre Eigentümerschaft auf - das Array bleibt als einziger Eigentümer übrig.

HTH

+0

ah ich sehe, also wenn es kein Parameter war, gibt es einfach auf sein Eigentum unmittelbar nach der Deklaration, aber zu diesem Zeitpunkt ist es freigegeben oder kommt es bis zum Ende des Autorelease-Pools, bevor es freigegeben wird?(ich gehe davon aus, dass der Autorelease-Pool nicht verwendet wird, aber ein bisschen mehrdeutig erscheint, über den Fall, über den Sie sprechen wollen) – Fonix

+0

Der Pool für die automatische Freigabe wird in diesem Fall nicht verwendet, da er nicht automatisch freigegeben wird Objekt. – rmaddy

+0

hab es geschafft, danke! – Fonix

4

ARC ist hier nicht fehlerhaft. Klingt wie der Artikel falsch ist.

ARC wird das zugewiesene Parameterobjekt wie erwartet freigeben, während das Array seine Referenz beibehält. Sobald das Array freigegeben wird, hat das Objekt keine Referenzen mehr und es wird auch wie erwartet freigegeben.

+0

Wenn wir ein paar mehr Leute dazu bringen können, uns zuzustimmen, dann schreiben Sie vielleicht im Artikel-Kommentar-Abschnitt, um sie oder irgendjemand anderen zu alarmieren, der den Artikel findet – Fonix