2017-03-06 2 views

答えて

6

はい、保持周期があります。 yへの参照である x.propertyOfTypeYプロパティを含む

y.propertyOfTypeX = x 

コピー値xy.propertyOfTypeXに、。

したがって

y.propertyOfTypeX?.propertyOfTypeY === y 

が成り立ちます。あなたが持っていることはpropertyOfTypeYstruct X の一部であること(とxyへの追加の参照を保持していること)、本質的に

のみ
class Y { 
    var propertyOfTypeY: Y? 
} 

var y = Y() 
y.propertyOfTypeY = y 

と同じです。

+0

'struct X {unowned let propertyOfTypeY:Y}'は、サイクルが壊れることに注意してください。 – Norman

3

TL; DR保持期間はありますが、の場合はと表示されます。

struct X { 
    let propertyOfTypeY: Y 
} 

class Y { 
    var propertyOfTypeX: X? 

    deinit { 
     print("I was deinit'ed") 
    } 
} 

do { 
    let y = Y() 
    let x = X(propertyOfTypeY: y) 
    y.propertyOfTypeX = x 
} 
// y and x should be dealloc'ed here, because the "do scope" ends 

コメントアウトy.propertyOfTypeX = xI was deinit'edが印刷されます、しかし、あなたはその割り当てを行う場合は、deinitが呼び出されることはありません。

クロージャを使用すると同じことが起こります。

+2

同様の "トリック"は、コードを 'do {...}'ブロックの中に置き、ブロックを実行した後にdeinitが呼び出されているかどうかをチェックすることです。それは非選択肢でも機能します。 –

+0

良い点は、理解するのが少し簡単です。変更を加えました。 – Edgar

関連する問題