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
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?
Artikel ist falsch. Und warum sie "alloc init" weiterhin anzeigen, während wir bequeme Methoden für Methodenbereiche verwenden ... Seltsam. –
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. –