07. ARC와 메모리 누수
1) ARC(Automatic Reference Counting)
- Swift의 ARC(Automatic Reference Counting)는 메모리 관리 기법 중 하나로, 객체나 인스턴스가 참조되는 횟수를 추적하여 메모리에서 해제할 시점을 결정합니다. 객체가 생성될 때마다 참조 횟수가 1 증가하고, 해당 객체를 참조하는 다른 객체나 변수가 없어지거나 더 이상 사용되지 않을 때 참조 횟수가 1 감소합니다. 참조 횟수가 0이 되면 해당 객체는 메모리에서 해제됩니다.
- ARC의 작동 방식
- 객체 생성: 객체가 생성되면 참조 횟수가 1 증가합니다.
- 객체 참조: 객체를 다른 변수나 상수에 할당하면 해당 객체의 참조 횟수가 1 증가합니다.
- 참조 해제: 객체의 참조가 없어지면(참조하는 변수나 상수가 없거나 **nil**이 할당되면) 참조 횟수가 1 감소합니다.
- Zeroing Weak References: 약한 참조(Weak Reference)는 객체의 참조 횟수를 증가시키지 않고 추적합니다. 객체가 해제되면 약한 참조는 자동으로 **nil**로 설정됩니다.
2) 강한 참조 순환(Strong Reference Cycle)문제와 해결 방법
- Swift로 개발할 때에는 메모리 누수(Memory Leak)을 주의해야 합니다.
- 참조는 디폴트로 강한 참조(Strong Reference)를 사용하는데, 이 강한 참조를 잘못 사용하면 메모리 누수(Memory Leak) 문제가 발생할 수 있습니다.
- 가장 대표적인 예가 두 개 이상의 인스턴스가 서로가 서로를 강한 참조일 때 발생합니다. 이 문제를 강한 참조 순환(Strong Reference Cycle or Retain Cycle)이라고 합니다.
- 강한 참조 순환: 메모리가 해제되지 않고 유지되어 메모리 누수가 발생하는 현상
강한 참조 순환 문제 해결 방법:
- 약한 참조(Weak Reference): 참조되는 대상을 약하게 참조하여 순환 참조를 방지합니다.
- **weak**는 옵셔널로 선언되는 참조입니다.
- 약한 참조는 참조하는 객체를 강제로 유지하지 않고, 참조 대상이 메모리에서 해제되면 자동으로 **nil**로 설정됩니다.
- 주로 순환 참조를 방지하기 위해 사용됩니다. 두 객체가 서로를 강하게 참조하는 경우, 순환 참조로 인해 메모리 누수가 발생할 수 있습니다. 이런 상황에서는 한쪽을 **weak**로 선언하여 순환 참조 문제를 해결할 수 있습니다.
- 비소유 참조(Unowned Reference): 참조되는 대상이 항상 유효한 경우에만 사용하며, 해당 대상이 해제될 수 있는 상황에는 사용하지 않습니다.
- **unowned**는 옵셔널이 아닌 비소유 참조를 나타냅니다.
- 비소유 참조는 항상 값이 있다고 가정하며, 참조하는 객체가 해제되면 런타임 에러가 발생할 수 있습니다.
- unowned 참조는 참조 대상이 해제될 수 있는 경우에만 사용해야 합니다. 그리고 그 객체가 메모리에서 해제되지 않은 상태에서만 해당 unowned 참조를 사용해야 합니다.
'iOS (스파르타) > Swift 문법' 카테고리의 다른 글
문법 심화 - 비동기와 네트워킹 (0) | 2024.06.12 |
---|---|
문법 심화 - 확장, 제네릭 (0) | 2024.06.12 |
문법 심화 - 고차함수, 예외처리 (1) | 2024.06.11 |
문법 심화 - 클로저04 (0) | 2024.06.11 |
문법 심화 - 접근제한자 (0) | 2024.06.10 |