ARC에 대한 이해
ARC(Automatic Reference Counting)
ARC는 Swift에서 메모리 관리를 자동으로 진행해주는 기술인데, 클래스 인스턴스가 더 이상 필요하지 않을 경우 메모리에서 자동으로 해제해줍니다.
작동원리
- ARC는 클래스 인스턴스에 대한 참조 횟수를 추적합니다.
- 참조 횟수가 0이 되면 해당 인스턴스는 더 이상 필요하지 않은 것으로 간주되어 메모리에서 자동으로 해제됩니다.
강한 참조(Strong Reference)
- 일반적인 클래스 인스턴스 생성 및 참조 방식으로, 참조하는 인스턴스의 참조 카운트를 증가시킵니다.
- 참조 횟수가 1 증가하며, 참조가 해제되면 참조 횟수가 1 감소합니다.
- 참조하는 인스턴스가 메모리에서 해제되지 않도록 유지합니다.
class Person {
let name: String
init(name: String) {
self.name = name
}
}
var person1: Person? = Person(name: "John")
var person2: Person? = person1
위 예시에서는 person1과 person2는 모두 Person 인스턴스를 강하게 참조하고 있으며, 이 경우 Person 인스턴스는 메모리에서 해제되지 않습니다.
약한 참조(Weak Reference)
- 참조 카운트를 증가시키지 않는 참조 방식이며, 참조 대상이 메모리에서 해제되어도 문제가 발생하지 않습니다.
- 참조하는 인스턴스의 수명이 자신보다 짧을 때, 참조 순환(Reference Cycle)을 방지하기 위해 사용됩니다.
- 참조하는 인스턴스가 메모리에서 해제되면 자동으로
nil로 설정됩니다.
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
}
deinit {
print("\(name)이 집 나감")
}
}
class Apartment {
let unit: String
weak var tenant: Person?
init(unit: String) {
self.unit = unit
}
deinit {
print("아파트 \(unit)이 팔림")
}
}
var john: Person? = Person(name: "John")
var unit4A: Apartment? = Apartment(unit: "4A")
john?.apartment = unit4A
unit4A?.tenant = john
위 예시는 Apartment 인스턴스는 Person 인스턴스를 약하게 참조하고 있으며, 이를 통해 강한 순환 참조를 해결할 수 있습니다.
비소유 참조(Unowned Reference)
- 비소유 참조는 참조된 개체의 참조 횟수를 늘리지 않음으로써 강력한 참조 순환을 방지하는 데 사용됩니다.
이는 참조 대상(참조되는 객체)이 참조 보유자보다 수명이 같거나 길다는 것이 보장될 때 사용됩니다. 그렇지 않을 경우 런타임 에러가 발생합니다. - 약한 참조와 달리 비소유 참조는 참조 대상이 할당 취소될 때
nil이 되지 않으며, 참조 대상이 할당 해제된 후 비소유 참조에 액세스하려고 하면 런타임 에러가 발생합니다. - 비소유 참조는 참조된 개체가 참조 수명 동안 항상 사용 가능하다고 가정하므로 선택 사항이 아니며 선택적인 래핑 해제가 필요하지 않습니다.
이렇듯 ARC는 Swift에서 메모리 관리를 자동으로 해주어 개발자가 메모리 누수 등의 문제를 걱정하지 않도록 해주는 것이다.
이해가 쉽도록 참조에 대해 비유를 해보자면,
더보기
강력한 참조(Strong Reference)
- 도서관에서 일반적인 대출과 같음
- 누군가가 객체에 대한 강력한 참조를 갖고 있는 한, 객체가 메모리에 남아있음
- 모든 강력한 참조가 해제될 때까지 객체가 할당 해제되지 않음
약한 참조(Weak Reference)
- 책을 직접 돌려주는 것이 중요하지 않다는 것을 이해하고 책을 빌리는 것과 같음
- 도서관을 닫았을 때(객체 할당이 취소됨) 대출자가 책을 아직 가지고 있다면,
- 그 책을 반납할 수는 없지만 어쨌든 문을 닫는 것이므로 문제가 되지 않음
비소유 참조(Unowned Reference)
- 특정 작업이나 기간 동안 책을 빌리는 것과 같음
- 작업이 완료되거나 시간이 지나면 대출자에게 필요한지 여부에 관계없이 책은 즉시 반환됨
- 이렇게 하면 책(객체)이 더 이상 필요하지 않을 때 즉시 출시될 수 있음
이런 식으로 비유하고 싶다.

Swift의 순환 참조(Circular Reference)는 어떻게 해결하지?
Swift의 순환 참조(Circular Reference)는 어떻게 해결하지?
이번 모의면접 질문에서 순환 참조를 어떻게 해결하는지에 대한 꼬리질문이 나왔는데, 분명 공부했음에도 답변을 하지 못했다. 그래서 다시 공부해야 할 필요성을 느끼고 순환 참조 해결에 대
helldev-world.tistory.com
'걔 (개발)로그 > Swift' 카테고리의 다른 글
| Swift의 override, 재정의, 상속··· 그게 다 뭔 소리람 (0) | 2024.08.05 |
|---|---|
| Swift의 순환 참조(Circular Reference)는 어떻게 해결하지? (0) | 2024.07.02 |
| Swift의 메모리 구조(Code, Data, Heap, Stack) | 도대체 어떻게 생겼나 봅시다. (0) | 2024.05.19 |
| Swift에서 Filter와 Map (0) | 2024.05.17 |
| Swift에서 프로퍼티 (Properties)와 메서드 (Methods) (0) | 2024.05.17 |