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 |
댓글