答えて
小さな例:
class A {
var b: B!
deinit {
print("deinit of A")
}
}
class B {
var a: A!
deinit {
print("deinit of B")
}
}
do {
let a = A()
let b = B()
a.b = b
b.a = a
}
をあなたが(多分遊び場に)このコードを実行した場合、それは何も印刷されません。それは、deinit
が両方のオブジェクトに対して決して呼び出されず、単に漏れたことを意味します。
しかし、あなたがweak
としての特性のいずれかを宣言した場合:
class A {
weak var b: B!
deinit {
print("deinit of A")
}
}
を次にdeinit
が呼び出されると、コンソールにメッセージが表示されます。
編集:閉鎖
この例を考えてみましょうとの例を追加します。
class C {
var f: (Void -> Void)!
deinit {
print("deinit for C")
}
}
do {
let c = C()
c.f = {
print(c)
}
}
c
はf
がc
を取り込み、f
をキャプチャします。だから我々はメモリリークを得た。
クロージャのリークを処理するには、キャプチャされたオブジェクトがweak
またはunowned
であることを宣言します。 ;オブジェクトが存在抜け出すとクロージャが呼び出されたときにnil
になるすることが可能かどう
do {
let c = C()
c.f = { [weak c] in
print(c)
}
}
基本的に、あなたはweak
を使用します。このようなこの時点でオブジェクトが存在することが確かな場合は、代わりにunowned
を使用してください。
c
を閉鎖内にweak
と宣言した後、「deinit for C」が表示されます。つまり、すべてが正常に割り当て解除されたことを意味します。
このすべての意味は、開発者ですか?
ほとんどすべての時間は、メモリ管理について心配する必要はありません。それはあなたのために自動的に行われます。オブジェクトは必要なときにだけ存在し、そうでないときには消えます。しかし、2つの非常に一般的な場合は注意する必要があり、メモリについて考える必要があります。
- 委任。それはココアの一般的なパターンであり、間違っていれば保持サイクルを作り出すことができます。正当な理由がない限り、常に代理人を
weak
と宣言してください。 - クロージャ。クロージャは、周囲のスコープ内のオブジェクトの参照をキャプチャし、自動的に通知します。クロージャを実装するときは、保持サイクルを作成するかどうかを確認します。はいの場合は、問題の変数を
weak
またはunowned
と宣言します。
詳細情報iBooksまたはhereの公式Apple Swiftブックをウェブサイトで読むことをお勧めします。
あなたの例をありがとう。これに関する情報が必要です。この1つのケースにはメモリだけが漏れますか?または任意の他の条件のリストがメモリリークが発生する可能性があります。 – iosLearner
また、メモリリークが発生する可能性があります。私はより多くの情報を与えるために私の答えを編集します。 –
- 1. コール迅速な方法
- 2. 迅速な方法は、
- 3. 迅速なライブストリームURLの作成方法
- 4. 迅速なWeb UIの開発
- 5. PHP/MySQLの迅速なアプリケーション開発?
- 6. Silverlight開発の迅速な反復
- 7. 私は、エラー発生した迅速な3
- 8. 迅速なデータ圧縮方法3?
- 9. 迅速なラインコントロールステートメント
- 10. 迅速なエンドツーエンドテスト
- 11. 迅速なエラーシミュレータ
- 12. 迅速な3
- 13. なぜ迅速な文法の誤り
- 14. AVPlayerItemの再生速度を迅速に変更する方法は?
- 15. 迅速なバックグラウンドの変更が迅速な回答
- 16. 迅速にビデオを再生する方法3 Xcode 8.2.1
- 17. 迅速にOAuth1 HMAC SHA1署名を生成する方法3
- 18. プロジェクトが迅速であっても、Cocoapodsは迅速に3.0のエラーが発生しません。2.3
- 19. 私は迅速にエラーが発生しました3
- 20. GoogleAnalytics - 迅速なエラー
- 21. reloadItemsAtIndexPath迅速なバグ?
- 22. は迅速な3
- 23. は、迅速な4
- 24. バックグラウンドスキャン迅速なBLE
- 25. ScrollView迅速なコンパイラエラー
- 26. 迅速にMPMoviePlayerControllerをミュートする方法
- 27. mailcore2迅速に実装する方法
- 28. 迅速なサーバ側のサーバソケットエラー
- 29. コアデータの迅速な3
- 30. 複数の迅速なパラメータ
低いAPIで再生する保持サイクル(CGReleaseStuffなど自分で呼びたいCGPathなど) – Larme
'retain cycles' - 互いに強い参照を保持する複数のオブジェクト:' A'は ' 「B」は「A」を参照する。 – luk2302