본문 바로가기
iOS/iOS

ARC [ Automatic Reference Counting ]

by 황민우 2022. 2. 22.

ARC이란?

- Automatic Reference Counting의 약자로 reference(참조) 타입인 클래스의 인스턴스를 관리합니다.

- Swift는 앱의 메모리 사용을 추적하고 관리하는 ARC를 사용합니다.

- 대부분의 경우에 메모리 작업은 이상없이 작동하며, 메모리 관리를 생각할 필요가 없습니다.

- ARC는 인스턴스가 더 이상 필요하지 않을 때, 인스턴스에 사용된 메모리를 자동적으로 해제합니다.


ARC의 강한 참조

- 클래스의 인스턴스를 만들때마다 ARC는 인스턴스에 대한 정보를 저장하기 위해 메모리를 할당합니다.

 (=이 메모리에는 해당 인스턴스의 자료형과 프로퍼티 저장)

- 인스턴스가 더 이상 필요하지 않을 때 ARC는 해당 인스턴스가 사용하는 메모리를 해제합니다.

- ARC가 아직 사용중인 인스턴스를 해제하면 해당 인스턴스의 프러퍼티/메서드를 접근할 수 없고 앱이 종료(Crash)됩니다.

- 인스턴스가 필요한 동안 사라지지 않도록 ARC는 현재 각 클래스 인스턴스를 참조하는 프로퍼티/상수/변수의 참조 횟수를 추적합니다.

- 프로퍼티/상수/변수가 클래스 인스턴스를 사용할 때마다 해당되며, 프로퍼티/상수/변수가 인스턴스를 강하게 참조하며 RC값이 1 증가합니다.

- 인스턴스는 참조가 유지되는 한 해제할 수 없기 때문에 "strong" reference(강한 참조)라고 합니다.


ARC의 사용

- 인스턴스가 다른 인스턴스의 프로퍼티/변수/상수에 할당될 때 RC가 1 증가합니다.
- 참조를 사용하는 프로퍼티/변수/상수에 nil을 할당하면 참조 횟수 1 감소합니다.
- 참조 횟수가(RC)가 0이 되면 인스턴스가 메모리에서 해제됩니다.

 

ARC에 대한 인스턴스 참조 예제

- init 메서드를 갖고 있는 Person이라는 클래스를 하나 만들겠습니다.

- SeaGreen이라는 optional 인스턴스 3개를 생성하겠습니다.(nil 대입을 위해 옵셔널 인스턴스로 생성)

- SeaGreen1 인스턴스에 seagreen 생성시키는 순간, Person인스턴스의 메모리가 할당되며 RC가 1 증가합니다.

- 이후 SeaGreen2, 3이 생성됨에 따라 RC값이 3까지 증가됩니다.

- SeaGreen1,2,3에 nil값이 할당되며 RC값이 1씩 감소되지만, 모든 메모리가 해제되기 전까지 deinit 메서드가 호출되지 않습니다. 

class Person{
    let name: String
    init(name: String){
        self.name = name
        print("\(name) 생성됨(init)")
    }
    deinit{
        print("\(name) 해제됨(deinit)")
    }
}
var SeaGreen1: Person?
var SeaGreen2: Person?
var SeaGreen3: Person?

SeaGreen1 = Person(name: "seagreen")	// Person인스턴스의 RC1
SeaGreen2 = SeaGreen1			// Person인스턴스의 RC2
SeaGreen3 = SeaGreen1			// Person인스턴스의 RC3

SeaGreen1 = nil			// Person인스턴스의 RC2
SeaGreen2 = nil			// Person인스턴스의 RC1
SeaGreen3 = nil			// Person인스턴스의 RC0, deinit 호출, 메모리(seagreen)해제

메모리를 참조하는 방법(Strong, Weak, Unowned)

강한 참조 (Strong Reference)

- 해당 인스턴스의 소유권을 가집니다.

- 자신이 참조하는 인스턴스의 retain count(참조 횟수)를 증가시킵니다.

- 값 지정 시점에 retain 되고, 참조가 종료되는 시점에 release가 됩니다.

• 기본 참조 방식으로 특별한 식별자 없음

var apartment: Apartment?

 

 

약한 참조 (Weak Reference)

- 강한 참조를 사용하는 경우를 피하기 위해 weak reference나 unowned를 사용해,

  인스턴스를 참조하더라도 참조 횟수를 늘리지 않을 수 있습니다.

- 참조하고 있는 상태라 하더라도 참조하는 인스턴스가 해제되었을 때, 자동으로 nil값을 할당합니다.

- 옵셔널과 var로 선언해야 합니다.
• 선언부에 weak 키워드 사용

weak var person: Person?

 

Unowned Reference

- Weak Reference와 비슷하게 강한 참조를 하지 않습니다.

- 참조하고 있는 대상이 제거되었을 때, nil값을 주지 않기 때문에 항상 값을 가질 것이란 가정에 사용합니다.

- non-optional 타입을 사용합니다.

- 참조할 인스턴스가 해제되지 않는다고 확신할 때 사용합니다.


내용 출처

https://www.youtube.com/watch?v=_Dx0buszoz4 

 

'iOS > iOS' 카테고리의 다른 글

as, as?, as!의 차이  (0) 2022.02.24
Escaping Closure  (0) 2022.02.23
SceneDelegate란?  (0) 2022.02.21
ViewController 생명주기  (0) 2022.02.19
App Life Cycle [ 앱 생명주기 ]  (0) 2022.02.18

댓글