私が通常見る強い参照サイクルの例は、互いに指し示すプロパティを持つ2つのクラスを含みます。一つだけのクラスは、このような他のインスタンスを指しているプロパティを持っている場合は、何を:これは強力なリファレンスサイクルかメモリリークですか?
class ClassA {
var classB: ClassB? = nil
}
class ClassB {
}
それから私はこのように私のインスタンスを作成します。
var myClassA = ClassA()
var myClassB = ClassB() //Reference count 1
myClassA.classB = myClassB //Reference count 2
// Now deallocate
myClassB = nil //Reference count 1
myClassA = nil
私はmyClassB
を割り当て解除したので、参照カウントは1です。myClassA.classB
の参照カウントはどうなりましたか? myClassA.classB = nil
を行ったことがないのでゼロには達しませんでした。これを行うにはdeinit
を使用してください。私がmyClassA = nil
をして以来、これは暗黙のうちに行われていますか?
これは強い参照サイクルとして分類できますか?私はそれが少なくともメモリリークだと思いますが、これは本当ですか?
コードに漏れも循環参照もありません。 'myClassA'を' nil'に設定すると、ARCは自動的に 'ClassB'の所有権を壊して、両方とも割り当てを解除します。 – ozgur
これを拡張するには、グラフには1つのエッジ( 'myClassA.classB - > myClassB')しかないのでサイクルはありません。 – jtbandes
そのコードがリンクを引き起こした場合、ARCはわずかに役立ちます。インスタンス・レベルで保持されているすべての参照は、インスタンスが解放されると解放されます。 – Avi