//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
ゆるい理解しかしてなかったので忘れた。
相互参照により解放されない例
二つのクラスを作成
お互いに参照を持ってしまうとdeinitが呼ばれない。(a.b = bとか片方のみだとちゃんと解放される)
これはweakをつけることで解決する。 この例で言えばクラスAかBどちらかにweakをつければ良いが、とりあえずryouhoutuketemita.
クロージャー
https://qiita.com/tarunon/items/6ac52a737ab49a967d6d
そもそも通信している最中にselfが解放されてしまう可能性とか