Die Beispiele für starke Referenzzyklen, die ich normalerweise sehe, beziehen sich auf zwei Klassen mit Eigenschaften, die zueinander zeigen. Was aber, wenn nur eine der Klassen eine Eigenschaft hat, wie diese auf die andere Instanz zeigen:Ist das ein starker Referenzzyklus oder ein Speicherleck überhaupt?
class ClassA {
var classB: ClassB? = nil
}
class ClassB {
}
Dann erstelle ich meine Instanzen wie folgt aus:
var myClassA = ClassA()
var myClassB = ClassB() //Reference count 1
myClassA.classB = myClassB //Reference count 2
// Now deallocate
myClassB = nil //Reference count 1
myClassA = nil
Seit ich myClassB
ausgeplant, die Referenzzählung ist 1. Was ist mit der Referenzzählung von passiert? Es hat nie Null erreicht, da ich nie myClassA.classB = nil
oder deinit
getan habe, um dies zu tun. Ist das implizit getan, seit ich myClassA = nil
getan habe?
Kann dies als ein starker Referenzzyklus kategorisiert werden? Ich könnte mir vorstellen, dass es zumindest ein Speicherleck ist, ist das wahr?
In Ihrem Code gibt es weder eine Leckage noch einen Zirkelverweis. Wenn Sie 'myClassA' auf' nil' setzen, bricht ARC automatisch den Besitz von 'ClassB', so dass beide freigegeben werden. – ozgur
Um darauf zu erweitern - es gibt keinen Zyklus, da Ihr Graph nur eine Kante hat: 'myClassA.classB -> myClassB'. – jtbandes
Wenn dieser Code eine Verknüpfung verursachte, würde ARC nur marginal nützlich sein. Alle Referenzen, die auf Instanzenebene gehalten werden, werden freigegeben, wenn die Instanz freigegeben wird. – Avi