churabou / iOS-develop-blog

0 stars 0 forks source link

5月24日 weakとunownedに関して #31

Open churabou opened 6 years ago

churabou commented 6 years ago

二つのクラスを作成


class A {

    var b: B?

    deinit {
        print("class A deinit")
    }
}

class B {
    var a: A?

    deinit {
        print("class B deinit")
    }
}
var a: A? = A()
var b: B? = B()

a = nil
b = nil
class A deinit
class B deinit
var a: A? = A()
var b: B? = B()

a.b = b
b.a = a

a = nil
b = nil

お互いに参照を持ってしまうとdeinitが呼ばれない。(a.b = bとか片方のみだとちゃんと解放される)

これはweakをつけることで解決する。 この例で言えばクラスAかBどちらかにweakをつければ良いが、とりあえずryouhoutuketemita.


class A {

    weak var b: B?

    deinit {
        print("class A deinit")
    }
}

class B {
    weak var a: A?

    deinit {
        print("class B deinit")
    }
}
var a: A? = A()
var b: B? = B()

a?.b = b
b?.a = a

a = nil
b = nil
class A deinit
class B deinit

クロージャー

https://qiita.com/tarunon/items/6ac52a737ab49a967d6d

そもそも通信している最中にselfが解放されてしまう可能性とか

//class A {
//    var b: B?
//}
//
//class B {
//    var a: A?
//}
//
//
//func a(){
//
//    var a: A? = A()
//    var b: B? = B()
//
//    a?.b = b
//    b?.a = a
//
//    // then
//    a = nil // deinit not called becouse a own b, and b onw a
//
//    // so you can use weak
//}

class A {
    var b: B?
}

class B {
    var c: C?
}

class C {
    var a: A?
}

func aaa() {
    var a: A? = A()
    var b: B? = B()
    var c: C? = C()

    a?.b = b
    b?.c = c
    c?.a = a
    // in this case
    // a onws c, c owns a via B

    let aaa = AAA()
    let bbb = BBB()

    aaa.bbb = bbb
}

class AAA {
    var bbb: BBB?

    init() {
        bbb?.closuer = {
            debugPrint(self)
        }
    }
}

class BBB {
    var closuer: (() -> Swift.Void)?
}

// in this case

// aaa owns bbb, also bbb owns aaa
// becouse bbb.clouser owns aaa, closure apture aaa on init