retain cycle

hankyulee·2023년 1월 8일
0

클래스 인스턴스의 래퍼런스 카운트가 남아있으면 메모리에서 해제되지 않는다. (리테인 사이클이 아니더라도.)





class A {
    var b: B?
    init(b: B?) {
        self.b = b
    }
    deinit {
        print("A deinit")
    }
}

class B {
    var c: C?
    init(c: C?) {
        self.c = c
    }
    deinit {
        print("B deinit")
    }
}

class C {
    var d: D?
    init(d: D?) {
        self.d = d
    }
    deinit {
        print("C deinit")
    }
}

class D {
    var a: A?
    init(a: A?) {
        self.a = a
    }
    deinit {
        print("D deinit")
    }
}

var a: A? = A(b: nil)
var b: B? = B(c: nil)
var c: C? = C(d: nil)
var d: D? = D(a: nil)

a?.b = b
b?.c = c
c?.d = d
d?.a = a

//b?.c = nil /
a = nil
b = nil
c = nil
b?.c = nil //이 코드는 무효화된다. b가 nil므로.
d = nil

var a1: A? = A(b: nil)
var b1: B? = B(c: nil)
a1?.b = nil
print(b1)

class K {
    var p: P?
    init(p: P?) {
        self.p = p
    }
    deinit {
        print("K deinit")
    }
}

class P {
    var k: K?
    init(k: K?) {
        self.k = k
    }
    deinit {
        print("P deinit")
    }
}

var k: K? = K(p: nil)
var p: P? = P(k: nil)
k?.p = p

아래와 같이 weak으로 선언할경우, k=nil이면 k가 deinit된다. Weak이 아닐경우, 해제되지 않는다.

0개의 댓글