技術と本について書くブログ

技術と本について書くblog。技術メモなど雑記を書いているblog。

SwiftのARCとweakとunownedと循環参照について

SwiftはARCを使用しているが、ARCはプロパティや変数からインスタンスへの参照がいくつあるかを参照カウント(英語ではリファレンスカウント)としてカウントしていて、その参照カウントが0になると、メモリから解放される。

class Hoge {
    let name: String
    init(name: String) {
        self.name = name
    }
}

var iremono: Hoge? = Hoge(name:"ほげ") //カウント1
iremono = nil //カウント0

何も設定しない場合は強参照になってそのカウントが追加されるのですが、その強参照のインスタンスと強参照のインスタンスがお互いに呼び合うとずっとメモリが解放されず循環参照になってしまいます。

そうならないために必要な弱参照の宣言weakunownedこれらは参照カウントを増やさないようになります。

では、それぞれ何が違うのか

unowned 非所有参照

weak 弱参照

とりあえず、nilの可能性がないならunowned。不明な箇所はweakで。