Swiftのweakとunowned」
3094 ワード
作者:Thomas Hanning,原文リンク,原文日付:2015-11-30訳者:pmst;校正:Cee;下書き:Cee
weakとunownedキーワードを使用すると、いわゆるループ参照を避けることができます.この文章では、両者の違いについて議論します.
私は「A Trick To Discover Retain Cycles」ブログでメモリ管理の重要性を強調しました.ARCがあなたのために苦労しても.
まず、
準備が完了したら、メモリ管理をテストします.まず、
図に示すように、
このような状況を回避するために、ARCがメモリを解放することを阻止しない
オブジェクトリレーションシップマップは次のように表示されます.
また、
属性がオプションのタイプかどうかによって、
A Trick To Discover Retain Cycles Optionals In Swift Swift Programming Series (iBook Store)
本文はSwiftGG翻訳グループから翻訳して、すでに作者の翻訳の授権を得て、最新の文章は訪問して下さいhttp://swift.gg.
weakとunownedキーワードを使用すると、いわゆるループ参照を避けることができます.この文章では、両者の違いについて議論します.
循環参照とは?
私は「A Trick To Discover Retain Cycles」ブログでメモリ管理の重要性を強調しました.ARCがあなたのために苦労しても.
まず、
RootViewController
とSecondViewController
の2つのビューコントローラを作成します.RootViewController
ビューのボタンをクリックすると、SecondViewController
が表示されます.storyboardでsegueを使用することで、この目的を簡単に実現することができます.また、ModelObject
という名前のクラスを作成しました.ModelObjectDelegate
のタイプの委任オブジェクトが含まれています(このオブジェクトはModelObjectDelegateプロトコルに従っているとも言えます).SecondViewController
のビューのロードが完了すると、現在のビューコントローラは、ModelObject
のエージェントに自分を任命します.
// ModelObject
import Foundation
protocol ModelObjectDelegate: class {
}
class ModelObject {
var delegate: ModelObjectDelegate?
}
// SecondViewController
import UIKit
class SecondViewController: UIViewController, ModelObjectDelegate {
var modelObject: ModelObject?
override func viewDidLoad() {
super.viewDidLoad()
modelObject = ModelObject()
modelObject!.delegate = self
}
@IBAction func closeButtonPressed(sender: UIButton) {
dismissViewControllerAnimated(true, completion: nil)
}
}
準備が完了したら、メモリ管理をテストします.まず、
SecondViewController
ビューコントローラを解放します.メモリの使用量が低下していないことがわかります.これはなぜですか.SecondViewController
オブジェクトが解放され、メモリが解放されることが望ましい.まず、オブジェクト間の関係を理解しましょう.SecondViewController
のロードが完了すると、オブジェクト間の関係は次のようになります.SecondViewController
を解放しました図に示すように、
RootViewController
はSecondViewController
に対して強い参照関係を持たなくなった.しかし、SecondViewController
とModelObject
のオブジェクトの間には常に相互に強い参照が保たれている.だから解放されませんWeak
このような状況を回避するために、ARCがメモリを解放することを阻止しない
weak
として参照関係を宣言することができます.
import Foundation
protocol ModelObjectDelegate: class {
}
class ModelObject {
weak var delegate: ModelObjectDelegate?
}
オブジェクトリレーションシップマップは次のように表示されます.
SecondViewController
オブジェクトとModelObject
オブジェクトの間には強い参照関係が1つしか残っていないため、メモリの解放に成功することは間違いありません.Unowned
また、
unowned
のキーワードを使ってweak
を置き換えることもできますが、両者の違いはどこですか?weak
を使用する場合、属性はオプションのタイプであり、nil
の値が許容される場合があります.一方、unowned
を使用する場合は、オプションのタイプに設定することはできません.unownedプロパティはオプションのタイプではないため、initメソッドで値を初期化する必要があります.
import Foundation
protocol ModelObjectDelegate: class {
}
class ModelObject {
// :swift
// nil
unowned var delegate: ModelObjectDelegate
init(delegate:ModelObjectDelegate) {
self.delegate = delegate
}
}
属性がオプションのタイプかどうかによって、
weak
とunowned
の間で選択できます.リファレンス
A Trick To Discover Retain Cycles Optionals In Swift Swift Programming Series (iBook Store)
本文はSwiftGG翻訳グループから翻訳して、すでに作者の翻訳の授権を得て、最新の文章は訪問して下さいhttp://swift.gg.