Strong, Weak
Interface Builder 를 이용하여 View 를 구성한 뒤,
코드상에서 제어하기 위해서는 IBOutlet 변수를 이용한다.
Storyboard 와 코드를 연결하다보면
Storage: Weak
으로 기본 설정이 되어있는 것을 볼 수 있다.
Weak
라고 기본 설정된 것을 누르게 되면,
다른 선택지는 Strong
이라고 되어있다.
Weak
과 Strong
은
ARC [ Auto Reference Count ] 와 관련이 깊다.
🍎 ARC [ Auto Reference Count ]
Swift 에서는 앱의 메모리 사용을 관리하기 위해 ARC 를 사용한다.
자동으로 참조 횟수를 관리하기 때문에
대부분의 경우에 개발자는 메모리 관리에 신경을 쓸 필요가 없고
ARC가 더 이상 사용하지 않는 인스턴스를 알아서 메모리에서 해제한다.
Strong
은 소유대상의 reference count 를 1 증가시켜,
dealloc 되지 않도록 하고,
Weak
은 reference count 는 증가시키지 않고 소유하여,
상호 참조 발생을 막아 메모리 누수를 막기 위해 사용한다.
복잡한 뷰 Hierarchy 를 가진 경우에는
Weak
대신 Strong
을 쓸 수 있다.
깊은 뷰 Hierarchy 구조에서 모든 Connection 이 Weak
일 때,
중간 부분에 있는 View 가 의도치 않게 dealloc 되었다면
그 하위의 뷰들도 함께 dealloc 된다.
복잡한 뷰 Hierarchy 구조상에서
subView
의 subView
를 사용해야 하는 경우,
의도치 않는 nil
을 겪을 수 있다.
메모리가 부족한 경우
ViewController
의 didReceiveMemoryWarning 이 호출된다.
didReceiveMemoryWarning 에서 mainView
를 nil
처리하여,
mainView
를 포함한 하위 뷰들 모두 dealloc
하여 메모리를 확보한다.
IBOutlet
변수가 Strong
으로 설정된 하위 뷰를 가지고 있다면
ViewController
가 Strong
으로 가지고 있는 Reference Count 1 때문에
최소 1 이하로 내려가지 않는다.
자식 뷰의 부모 뷰가 nil 이 되더라도 자식 뷰는 dealloc 되지 않아,
보이지 않는 뷰가 메모리를 차지하는 상황이 된다.
📚 Reference
The Swift Language Guide
Interface Builder IBOutlet연결에 Strong 과 Weak 어떤것을 써야할까?