dev._.note

[Swift] ARC(Automatic Reference Counting) 본문

Dev/SWIFT

[Swift] ARC(Automatic Reference Counting)

Laena 2023. 12. 12. 23:25

ARC란?

Swift의 ARC(Automatic Reference Counting)는 메모리 관리 기법 중 하나로, 객체나 인스턴스가 참조되는 횟수를 추적하여 메모리에서 해제할 시점을 결정. 객체가 생성될 때마다 참조 횟수가 1 증가하고, 해당 객체를 참조하는 다른 객체나 변수가 없어지거나 더 이상 사용되지 않을 때 참조 횟수가 1 감소. 참조 횟수가 0이 되면 해당 객체는 메모리에서 해제됨.

ARC의 작동 방식

  1. 객체 생성: 객체가 생성되면 참조 횟수가 1 증가.
  2. 객체 참조: 객체를 다른 변수나 상수에 할당하면 해당 객체의 참조 횟수가 1 증가.
  3. 참조 해제: 객체의 참조가 없어지면(참조하는 변수나 상수가 없거나 **nil**이 할당되면) 참조 횟수가 1 감소.
  4. Zeroing Weak References: 약한 참조(Weak Reference)는 객체의 참조 횟수를 증가시키지 않고 추적. 객체가 해제되면 약한 참조는 자동으로 nil로 설정.

ARC의 판단기준

특정 객체가 더 이상 사용되지 않는다는 것을 ARC는 특정 클래스 객체를 참조하는 변수, 상수, 프로퍼티들의 개수를 카운팅함.
특정 객체에 적어도 하나라도 참조변수가 존재한다면 ARC에서는 메모리 해제를 발생시키지 않음.
반대로, 활성화된 참조변수가 존재하지 않는다면 ARC는 특정 객체를 메모리로부터 해제시킴.

쉽게 말해, 특정 객체 하나가 존재하고 이를 여러곳의 변수가 참조할 때 한 객체에 대한 count가 증가.

class SomeValue {
    var name: String
    init(name: String) {
        self.name = name
    }
}
let someValue = SomeValue(name: "팀쿡") // reference count => 1
let someValue2 = someValue // reference count => 2

 

ARC 예제

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

reference1 = Person(name: "John Appleseed")
reference2 = reference1
reference3 = reference1
reference1 = nil
reference3 = nil
reference2 = nil 

 

 

 

'Dev > SWIFT' 카테고리의 다른 글

[Swift] 스레드(Thread)  (0) 2023.12.14
[Swift] 프로토콜(Protocol)  (0) 2023.12.13
[Swift] 예외처리  (0) 2023.12.11
[Swift] 클로저(Closure)  (0) 2023.12.10
[Swift] Guard문  (0) 2023.12.08