[iOS] Strong vs. Weak

Eugenie·2022년 7월 13일
1

Strong, Weak

Interface Builder 를 이용하여 View 를 구성한 뒤,
코드상에서 제어하기 위해서는 IBOutlet 변수를 이용한다.

Storyboard 와 코드를 연결하다보면
Storage: Weak 으로 기본 설정이 되어있는 것을 볼 수 있다.

Weak 라고 기본 설정된 것을 누르게 되면,
다른 선택지는 Strong 이라고 되어있다.

WeakStrong
ARC [ Auto Reference Count ] 와 관련이 깊다.

🍎 ARC [ Auto Reference Count ]

Swift 에서는 앱의 메모리 사용을 관리하기 위해 ARC 를 사용한다.
자동으로 참조 횟수를 관리하기 때문에
대부분의 경우에 개발자는 메모리 관리에 신경을 쓸 필요가 없고
ARC가 더 이상 사용하지 않는 인스턴스를 알아서 메모리에서 해제한다.

Strong 은 소유대상의 reference count 를 1 증가시켜,
dealloc 되지 않도록 하고,

Weak 은 reference count 는 증가시키지 않고 소유하여,
상호 참조 발생을 막아 메모리 누수를 막기 위해 사용한다.

When to use 'Strong'

복잡한 뷰 Hierarchy 를 가진 경우에는
Weak 대신 Strong 을 쓸 수 있다.

깊은 뷰 Hierarchy 구조에서 모든 Connection 이 Weak 일 때,
중간 부분에 있는 View 가 의도치 않게 dealloc 되었다면
그 하위의 뷰들도 함께 dealloc 된다.

복잡한 뷰 Hierarchy 구조상에서
subViewsubView 를 사용해야 하는 경우,
의도치 않는 nil 을 겪을 수 있다.

When to use 'Weak'

메모리가 부족한 경우
ViewControllerdidReceiveMemoryWarning 이 호출된다.

didReceiveMemoryWarning 에서 mainViewnil 처리하여,
mainView 를 포함한 하위 뷰들 모두 dealloc 하여 메모리를 확보한다.

IBOutlet 변수가 Strong 으로 설정된 하위 뷰를 가지고 있다면
ViewControllerStrong 으로 가지고 있는 Reference Count 1 때문에
최소 1 이하로 내려가지 않는다.

자식 뷰의 부모 뷰가 nil 이 되더라도 자식 뷰는 dealloc 되지 않아,
보이지 않는 뷰가 메모리를 차지하는 상황이 된다.


📚 Reference
The Swift Language Guide
Interface Builder IBOutlet연결에 Strong 과 Weak 어떤것을 써야할까?

profile
🌱 iOS developer

0개의 댓글