Mein Wissen über ARC wurde heute getestet, ich stolperte über diesen Artikel und es gibt ein Beispiel unter der Überschrift "Verschachtelung von Aussagen", das meiner Meinung nach falsch scheint.
In dem oben gezeigten Beispiel zeigt die mit einem grünen Unterstrich hervorgehobene Zeile an, dass die in der Funktion zugewiesene Zeichenfolge beim Erstellen zuerst einen Retain-Zähler +1 erhält, dann beim Hinzufügen zum Array erneut +1 und dann einmal Das Array wird nach der for-Schleife nicht gesetzt. Der Retain-Zähler der Zeichenfolge wird um 1 reduziert, sodass die ursprüngliche Zeichenfolge mit einer Retain-Anzahl von 1 zurückbleibt und somit nicht freigegeben wird.
Ich hätte angenommen, der Compiler wäre schlau genug gewesen, um wenigstens ein Objekt so zu machen, dass es anfangs keine Retain-Zählung hat, denn wenn Sie gerade
hatten %Vor%Diese Zeichenfolge, die zugewiesen wird, würde nichts darauf hinweisen und würde freigegeben, wenn der Autorelease-Pool zu einem Ende kommt, anstatt für immer eine Retain-Zählung 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?
Der Artikel ist falsch.
Ihr Verständnis ist im Wesentlichen korrekt, obwohl der Autorelease-Pool in diesem Fall nicht verwendet wird. Der Unterausdruck:
%Vor% gibt ein Objekt im Besitz zurück, wie auch alle init
-Methoden. Dieses Objekt wird an addObject:
übergeben und das Array übernimmt auch die Eigentümerschaft. 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
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.
Tags und Links objective-c ios automatic-ref-counting