ARC(Automatic Reference Counting)の弱参照(weak,unowned)のメモ

swiftのクロージャが良く分かっていないので、それを調べていたら、今度はweakとかunownedが良く分かっていなので、それを調べると言う、良くある芋づる式調査になってしまった。

weakとかunownedとかは、2週間後ぐらいにきっとまた分からなくなっていると思うので、とりあえず今日調べた事をざっくりメモしておく。

はじめに

まず、weak/unownedは弱参照(Weak Reference)と呼ばれる。これとは反対に強参照(Strong Reference)というのも有り、swiftで普通に何も考えずclassのinstanceを作成して変数に格納すると、強参照になるとのこと。

強参照と弱参照の違いは、ざっくり言うと以下になる(と思う)

強参照:作成したinstanceを強参照している変数が有る限り、instanceはメモリから消えない

class Hoge1 {
    init() {
    }

    deinit {
        puts("deinit is called")
    }
}

var inst1: Hoge1? = Hoge1()
var inst2 = inst1

inst1 = nil // この時点ではまだdeinitは呼ばれない
inst2 = nil // この時点でdeinitが呼ばれる

弱参照:弱参照の変数がinstanceを参照していても、強参照の変数がゼロになったら弱参照の変数にはnilが入れられる

class Hoge1 {

    var fuga: String?

    init() {
        self.fuga = "fugafuga"
    }

    deinit {
        puts("deinit is called")
    }
}

var inst1: Hoge1? = Hoge1()
weak var inst2: Hoge1? = inst1

inst1 = nil // inst2が弱参照のため、この時点でdeinitが呼ばれる

if let inst2 = inst2 {
    puts("inst2 is not nil")
} else {
    puts("inst2 is nil") // こっちが実行される
}

weakとunownedの違い

1.変数の宣言時

weakはARCによってnilがセットされる可能性が有るため、変数はOptionalで宣言しないといけない。
unownedはnilがセットされる事は無いので、Optionalでは宣言出来ない。

2.変数の使用時

weakはnilが入っているかもしれない事を考慮して使う必要がある。
unownedはinstanceが存在する事が前提のため、そういったシーンでのみ使うべき。

まとめ

クロージャを調べてたら、メモリ管理の話に飛んでしまった。
こういった事を知らなくてもある程度のアプリは作れると思うけど、サンプルコードとか読む時に、理解出来ていないキーワードが有るとストレスが溜まるので、徐々に知識を蓄積していきたい。

コメント

タイトルとURLをコピーしました