5

Swift verwendet "Automatische Referenzzählung", um Objekte, die nicht mehr referenziert sind und daher nicht mehr benötigt werden, freizugeben. Der Swift Sprachführer [1] besagt Folgendes:Möglichkeit von ARC Überlauf in Swift?

Jedes Mal, wenn eine neue Instanz einer Klasse erstellen, ARC einen Teil des Speichers Informationen über diese Instanz zu speichern zuordnet. Dieser Speicher enthält Informationen über [...] Werte aller gespeicherten Eigenschaften, die mit dieser Instanz verknüpft sind.

Ich nehme an, dass der Referenzzähler als Integer gespeichert wird. Könnte der Referenzzähler dann unter einem Überlauf leiden? Wenn dies der Fall ist, welche Auswirkungen hätte dies auf mein Programm, würden die Objekte, die immer noch von anderen referenziert werden, einfach freigegeben?

Als ein Beispiel: wenn der Zähler zum Beispiel eine vorzeichenlose 2-Byte-Ganzzahl wäre, würde dies die obere Grenze von Referenzen auf ein Objekt (bei noch immer korrekter Referenzzählung) bei etwa 130k setzen. Sobald diese Obergrenze erreicht ist und das Objekt erneut referenziert wird, würde der Zähler um eins erhöht und wieder auf 0 gesetzt.

[1] https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

+3

4294967296 Referenzen? Wowz. Haben Sie ... genug Speicher, um das zu tun? – Zizouz212

+0

Mir ist bewusst, dass die Frage eher hypothetisch ist, das Verhalten in diesem Fall würde mich dennoch interessieren;) – Benjamin

Antwort

7

NSObject des RetainCount ist eine 64-Bit-Ganzzahl auf 64-Bit-Betriebssystem ist. Und es ist eine 32-Bit-Ganzzahl ohne Vorzeichen auf 32-Bit-Betriebssystemen. Dies ist auch die Größe des Adressraums. Daher ist es unmöglich, so viele Referenzen auf ein einzelnes Objekt zu erstellen und die Anzahl zu überschreiten.