강한 참조와 약한 참조
아웃렛 변수는 스토리보드에 정의된 객체를 커스텀 클래스에서 참조할 수 있도록 연결된 변수입니다. 이는 스토리보드의 객체와 직접적으로 연결되기 때문에, 해당 객체의 속성을 커스텀 클래스에서 직접 호출할 수 있습니다.
오늘은 이 아웃렛 변수를 선언할 때, 설정창 하단에 있는 [Storage] 영역의 옵션에 대해 알아보도록 하겠습니다.
[Storage] 영역의 옵션은 "Strong"과 "Weak"이 있습니다. 기본 값은 "Weak" 옵션입니다. 해당 옵션은 iOS 시스템(ARC)에서 변수의 메모리 관리와 관련이 있습니다. "Strong" 타입은 강한 참조, "Weak" 타입은 약한 참조라고 부릅니다.
ARC(Auto Reference Counter): '특정 변수를 몇 군데에서 사용하고 있는가'를 계산하는 시스템. 해당 변수를 사용하면 카운트를 +1, 사용이 끝나면 -1 처리하고 변수의 카운트가 0이 되면 iOS 시스템이 그 변수를 제거하고 사용된 메모리를 회수해 재사용이 가능하도록 메모리 공간을 확보한다.
Strong 타입으로 선언된 아웃렛 변수를 어디선가 참조하면 ARC에서 카운트가 +1 처리됩니다. 반면 Weak 타입으로 선언되면 다른 곳에서 참조하더라도 카운트가 증가되지 않습니다. 따라서 Weak 타입은 사용 도중에 해당 변수가 제거되고 메모리가 회수될 수 있습니다.
Weak 타입이 필요한 경우는 메모리가 부족하거나, 순환 참조 오류가 발생할 때 입니다.
1. 메모리가 부족한 경우
iOS에서 메모리가 부족한 상황이 발생하면 특정 뷰를 nil이 되도록 처리하는 경우가 있습니다. 이때 해당 뷰 내부에서 Weak 타입으로 선언된 변수는 메모리에서 삭제되면서 메모리를 확보할 수 있습니다.
반면 Strong 타입인 경우 다른 곳에서 참조하고 있다면 해당 뷰가 nil이 되어도 카운트가 0이 아니면 삭제되지 않고 메모리에 그대로 남아있게 됩니다. 즉, 사용하지 않는 변수가 메모리를 차지하고 있는 메모리 누수 현상이 발생합니다.
2. 순환 참조 오류
순환 참조 오류란 두 개 이상의 객체가 서로를 강하게 참조하고 있는 경우 객체들이 메모리에서 해제될 수 없는 상황을 의미합니다.
A객체와 B객체가 서로를 강하게 참조하고 있는 경우, A객체와 B객체의 카운트는 항상 +1이 되어 있어 메모리에서 해제될 수 없습니다. A객체를 메모리에서 우선 해제하려고 해도 B객체에서 A객체를 참조하고 있기 때문에 해제가 되지 않고, B객체를 메모리에서 우선 해제하려고 해도 같은 상황으로 해제되지 않습니다.
만약 한 객체가 약한 참조로 되어 있다면 시스템은 순환 오류를 해결하기 위해 Weak 타입으로 참조된 변수를 우선 해제합니다. 그러면 순환 참조 사이클이 끊어지면서 나머지 변수도 참조 카운트가 0이 되어 차례대로 메모리에서 해제됩니다.
'Mobile > iOS' 카테고리의 다른 글
[iOS] 커스텀 뷰 만들기(@IBDesignable & @IBInspectable) (0) | 2023.03.31 |
---|---|
[iOS] defer 블록 (0) | 2023.01.19 |
[iOS] 접근 제한자 간단 정리 (0) | 2023.01.11 |
[iOS] Xcode 14, iOS 15 에서 Navigation Bar Color 설정 방법 (0) | 2023.01.11 |
[iOS] 이전 화면으로 값을 전달하는 방법 (0) | 2022.12.23 |