間のサイクルを保持します。しかし、クラスと構造体の違いが上記の例にどのように当てはまるかは私には分かりません。保持サイクルを引き起こすか、structの使用のために安全なコードですか?は、私は、コードを次していると仮定すると、クラスや構造体
答えて
はい、保持周期があります。 y
への参照である x.propertyOfTypeY
プロパティを含む
y.propertyOfTypeX = x
コピー値x
y.propertyOfTypeX
に、。
したがって
y.propertyOfTypeX?.propertyOfTypeY === y
が成り立ちます。あなたが持っていることはpropertyOfTypeY
はstruct X
の一部であること(とx
がy
への追加の参照を保持していること)、本質的に
class Y {
var propertyOfTypeY: Y?
}
var y = Y()
y.propertyOfTypeY = y
と同じです。
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 = x
とI was deinit'ed
が印刷されます、しかし、あなたはその割り当てを行う場合は、deinit
が呼び出されることはありません。
クロージャを使用すると同じことが起こります。
同様の "トリック"は、コードを 'do {...}'ブロックの中に置き、ブロックを実行した後にdeinitが呼び出されているかどうかをチェックすることです。それは非選択肢でも機能します。 –
良い点は、理解するのが少し簡単です。変更を加えました。 – Edgar
- 1. Automapperはこの列挙契約仮定クラスと構造体AfterMap
- 2. Javaオブジェクト構造のスレッドセーフパブリッシング?私は次のコードを持っていると仮定すると
- 3. エラーは、私は、クラス構造体にアクセスしようとしているクラスの構造体
- 4. C3P0私は、次のコードを持っていると仮定するとC3P0
- 5. は、私は次の構造体を持っているC++
- 6. 私はTAILQ構造体持っている間違った構造体とmmap
- 7. 構造体またはクラスをパラメータとして使用する
- 8. 私は、単純な構造体持っている構造体
- 9. のは、私は、次のコード(簡体字)を持っていると仮定しましょうメタル
- 10. は、私は、次のスキーマを持っていると仮定し
- 11. 私は、次の問題を抱えている構造体
- 12. リンクリスト:私は次の構造から構築ノードと、リンクリストを持っている別の構造体の中に
- 13. 私は、次の構造体持っているベクトル要素
- 14. はい、私は次のHTMLコード/構造持って、私はテーブル
- 15. 構造体とクラスCではC++
- 16. C#クラスと構造体
- 17. のemacs:クラスと構造体
- 18. 活字体とThreeJS、私は次のコードをしているローダー
- 19. 次のように私はクラスの構造とデータを持っている
- 20. 構造体のToString特性を正しく実装する方法は?私は、コードを持っていると仮定し
- 21. 私はこのコードを持っていると仮定し
- 22. 我々は以下のクラス構造を持っていると仮定継承したクラス
- 23. 構造体へのポインタを作成すると、私は次のように定義構造体を持っている
- 24. 構造体をクラスの引数として使用するC++
- 25. D純粋なクラスや構造体
- 26. は、私は次の操作を実行すると仮定され、次のコードを持っているループ
- 27. 構造体の構造体とオブジェクトは、クラス内でどこに属していますか?
- 28. 私は構造体のマルチマップを作成しようとしています構造体
- 29. 構造体のクラスとファクトリのクラス
- 30. 少ない私が構造次のコードしている
'struct X {unowned let propertyOfTypeY:Y}'は、サイクルが壊れることに注意してください。 – Norman