-
Swift - ARC (Automatic Reference Counting)플랫폼/iOS 2023. 12. 1. 18:56
ARC (Automatic Reference Counting)은 Swift에서 사용되는 메모리 관리 모델이다. ARC는 앱에서 인스턴스를 생성하고 참조할 때마다 해당 인스턴스에 대한 참조 횟수를 추적하고, 참조 횟수가 0이 되면 해당 인스턴스를 메모리에서 해제한다.
ARC는 주로 힙 영역에 할당된 객체들을 자동으로 관리한다. 그렇기 때문에 명시적인 작업을 따로 해주지 않아도 되는데, 강한 참조 순환 (Strong Reference Cycle)이 발생했을때는 메모리 누수(Memory Leak)가 발생하기 때문에 명시적인 작업을 해주어야 한다. 작업은 크게 두가지로 나뉜다.
약한 참조
강한 참조순환 상태는 객체가 서로 강한 참조를 하고있는 상태이기때문에 RC(Reference Counting)값이 존재한다. 이같은 상황에서 약한참조를 사용하면 서로 참조하고 있는 상태이지만 RC값은 증가하지 않는다. 코드를 통해서 확인해보면 다음과 같다.
class Person { var name: String var pet: Dog? init(name: String) { self.name = name } deinit { print("\(name) 메모리 해제") } } class Dog { var name: String weak var owner: Person? init(name: String) { self.name = name } deinit { print("\(name) 메모리 해제") } } var person: Person? = Person(name: "홍길동") var dog: Dog? = Dog(name: "보리") person?.pet = dog dog?.owner = person // person과 dog가 서로를 강한 참조하지 않고 있으므로 메모리 누수가 발생하지 않음 person = nil dog = nil
약한 참조는 weak 키워드를 사용한다. 약한 참조를 사용할때 주의할점은 weak var에 무조건 옵셔널로 선언을 해주어야 한다는 것이다. 왜냐하면 참조하던 인스턴스가 nil이 되었을때 nil을 자동 반환하기 때문에 값이 바뀌므로 var를 사용해야한다.
비소유 참조
비소유 참조도 약한 참조와 마찬가지로 강한 참조 순환을 해결하기 위한 메모리 관리 방법 중 하나이다. 비소유 참조는 참조된 객체가 항상 유효하다고 가정하기 때문에 RC값이 증가하지 않고, 참조된 객체가 nil이라면 런타임 오류가 발생한다. 코드를 통해서 확인해보면 다음과 같다.
class Person { var name: String var pet: Dog? init(name: String) { self.name = name } deinit { print("\(name) 메모리 해제") } } class Dog { var name: String unowned var owner: Person init(name: String, owner: Person) { self.name = name self.owner = owner } deinit { print("\(name) 메모리 해제") } } var person: Person? = Person(name: "홍길동") // 비소유 참조로 설정된 owner 속성 var dog: Dog? = Dog(name: "보리", owner: person!) person?.pet = dog // person이 먼저 nil로 설정되면서 dog에서 참조하는 owner가 nil이 되어 런타임 오류 발생 person = nil
비소유 참조는 unowned 키워드를 사용한다. 코드에서는 참조된 객체인 person을 먼저 해제하려고 했기 때문에 에러가 발생한다.
'플랫폼 > iOS' 카테고리의 다른 글
Swift - UITraitCollection에 대해서 알아보자 (0) 2024.01.21 Swift - 타입 캐스팅 (2) 2023.11.22 Swift - 네임드 튜플 정의하기 (0) 2023.10.31