THIS IS ELLIE

Swift ARC에 대해서(2) 본문

개발/Swift

Swift ARC에 대해서(2)

Ellie Kim 2019. 4. 19. 15:45

스위프트의 ARC는 앱의 메모리 사용을 추적하고 관리합니다.

 

https://hyerios.tistory.com/32에서 ARC란 무엇인지 알아보았습니다.

ARC는 Person인스턴스에 대한 참조 카운트를 추적하고 Person이 더 이상 필요하지 않으면(참조 카운트가 0이 되면) 인스턴스 할당을 해제했습니다. 자동으로 관리해줌에도 불구하고 신경 써줘야 하는 게 있다고 했는데 그것은 메모리 누수입니다.

 

그럼 순환참조는 어떤 상황에 발생될까요 .ㅇ.

 

클래스 인스턴스 간 순환 참조

 

두 개의 클래스의 인스턴스가 서로 강한 참조로 각 인스턴스가 다른 인스턴스를 참조하는 경우 순환 참조(strong reference cycle)가 생깁니다.

 

예를 들어 


class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    init(unit: String) { self.unit = unit }
    var tenant: Person?
    deinit { print("Apartment \(unit) is being deinitialized") }
}

Person클래스와 Apartment라는 클래스를 정의합니다.

Person 클래스에는 name과 apartment가 있습니다.

사람은 소유하는 아파트가 없을 수 있기 때문에 apartment는 옵셔널입니다.

 

Apartment 클래스에는 unittype과 tenant가 있습니다.

아파트에 항상 세입자가 있는 것은 아니기 때문에 tenant 또한 옵셔널입니다.

 

두 클래스에서 deinit을 두어 할당이 해제되는지 확인해줍니다.

할당이 해제되면  deinitialized 되었다고 출력해줍니다.


var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

Person인스턴스 변수 john과 Apartment인스턴스 변수 unit4A를 생성합니다.

특정 Person인스턴스(Person(name: "John Appleseed"))와 Apartment인스턴스(Apartment(unit: "4A")를 만들어 각각의 변수 john, unit4A에 할당해줍니다.

 

 

위와 같이 john변수는 Person인스턴스에 대해 강한 참조를 가지고, unit4A변수는 Apartment인스턴스에 대해 강한 참조를 가집니다.


john!.apartment = unit4A
unit4A!.tenant = john

사람이 아파트를 갖고 아파트에는 세입자가 있을 수 있습니다.

 

이렇게 두 인스턴스를 연결하면 두 인스턴스 간에 순환 참조가 생성됩니다.

 

즉 Person 인스턴스는 강한 참조로 Apartment인스턴스를 가지며 Apartment 인스턴스 또한 강한 참조로 Person인스턴스를 가집니다.


john = nil
unit4A = nil

따라서 john이나 unit4A변수가 가진 강한 참조를 해제시켜도 참조 카운트가 0으로 떨어지지 않습니다.

결국 인스턴스가 ARC에 의해 할당이 해제되지 않습니다.

할당이 해제되지 않았기 때문에 당연히 deinit이 호출되지 않습니다.

 

이렇게 되면 메모리 누수의 원인이 됩니다.

 

Person인스턴스와 Apartment 간의 강한 참조는 여전히 남아있으며 접근할 방법 또한 없습니다.

 

 

이렇게 . . . 메모리 누수가 발생하게 됩니다.

 

https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

 

Automatic Reference Counting — The Swift Programming Language (Swift 5)

Automatic Reference Counting Swift uses Automatic Reference Counting (ARC) to track and manage your app’s memory usage. In most cases, this means that memory management “just works” in Swift, and you do not need to think about memory management yourself. A

docs.swift.org

 

반응형

'개발 > Swift' 카테고리의 다른 글

Phantom Type 팬텀타입  (0) 2019.05.07
Swift ARC에 대해서(3)  (0) 2019.04.20
Swift ARC에 대해서(1)  (0) 2019.04.18
Swift String Substring  (0) 2019.04.12
isEmpty와 count == 0 비교하기  (2) 2019.04.05