iOS) 메모리 관리 (2/3) - strong , weak, unowned, 순환 참조

ARC

swift에서 사용하는 가비지콜렉터. 약간 다른 점이 있는데 GC는 런타임에 동작, ARC는 컴파일 단계에서 동작하기 때문에, 차이가 생김 (수집능력 vs 앱성능)

ARC의 기본 로직은 변수 선언, 대입시마다 카운트를 증가시키고 해제될 때마다 카운트를 감소시켜서 0이 되는 순간 힙에서 제거한다.

해당 특징 때문에 순환참조가 발생하는 경우가 생기는데, A클래스 안에 A클래스 프로퍼티가 있을 때, A클래스간 참조시키는 경우 카운트가 2가되서 해당 클래스들이 해제될 때 카운트가 1이 남아서 메모리 누수가 발생하는 경우다.

이를 막기 위해 Weak 키워드를 사용한다.

Weak

스위프트의 참조는 기본적으로 strong이다. 참조할 때마다 카운트가 증가한다.

Weak의 경우 카운트를 증가시키지 않는다. 따라서 위의 사례같은 순환참조를 막을 수 있다.

음.. 그럼 만약에 weak 변수가 존재하는데 참조 중인 클래스를 해제하면 세그폴트가 생기는거 아닌가???🤔

class A { ... }
var strongA: A = A()
weak weakA: A = strongA
strongA = nil
weakA.funA <- 세그 아닌가?

weak 변수는 옵셔널로 선언되서 괜찮나봐요☺️

🤔누군가가 컴플리션을 만들 때는 자신없으면 걍 weak를 쓰라던데... ...

&ref

You don't (always) need [weak self]

What does "weak self" mean in a Swift Closure?

Weak self and unowned self explained in Swift