본문 바로가기
Swift/기본

ARC 1편 - ARC 란?

by 밤새는탐험가 2024. 4. 19.

참조타입은 메모리 해제가 중요한 문제이다. 

왜냐하면? 인스턴스가 적절한 시점에 메모리에서 해제되지 않으면 

메모리 자원 낭비 + 성능 저하로 이어지기 때문이다. 

 

이를 해결하고자 스위프트에서는 메모리 관리 기법인 ARC를 사용한다. 

 

✔ RC: Reference Counting 으로 참조 횟수 계산을 뜻한다. 

(구조체, 열거형은 값 타입으로 적용이 안된다.)

 

 

ARC 사용

Person 클래스를 선언하고, init(), deinit을 통해 인스턴스 생성과 해제에 따른 print()문을 실행한다.

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

 

 

Person 클래스 타입의 reference 변수를 선언한다. 

모두 옵셔널 변수이고, 초기값은 nil을 갖는다. 

 

var reference1: Person?
var reference2: Person?
var reference3: Person?

 

 

reference1 변수에 Person 인스턴스를 참조시키고, 나머지 두 변수들은 reference1을 할당한다. 

이 경우 reference2, 3은 Person 인스턴스를 참조하게 된다. 

 

이 시점에서 Person 인스턴스에 대한 참조 횟수는 3이 된다.

 

reference1 = Person(name: "John Appleseed")
// Prints "John Appleseed is being initialized"
reference2 = reference1
reference3 = reference1

 

 

reference1, 2 두 변수의 참조를 해제하더라도 

reference3이 Person 인스턴스에 대해 참조하고 있기 때문에 

Person 인스턴스는 해제되지 않는다.

 

reference1 = nil
reference2 = nil

 

 

 reference3에 nil을 할당하고 나서야 더 이상 Person 인스턴스를 참조하고 있는 것이 없기 때문에 ARC가 Person 인스턴스를 메모리에서 해제한다.

 

reference3 = nil
// Prints "John Appleseed is being deinitialized"

 

 

'Swift > 기본' 카테고리의 다른 글

DispatchQueue.main과 DispatchQueue.global  (1) 2024.04.20
ARC 2편 - 강한 참조 순환  (0) 2024.04.19
메모리 구조 (Code, Data, Stack, Heap)  (1) 2024.04.18
접근 제어자 (Access Control)  (0) 2024.04.17
서브스크립트  (1) 2024.04.16