ARC(Automatic Reference Counting)
- ARC(Automatic Reference Counting)
- 자동 참조 카운팅으로서 자동으로 메모리를 관리해주는 방식
- 참조 카운팅이 0이 될때만 메모리에서 해제됨
- 동작원리:
- 클래스의 새로운 인스턴스를 만들 때 인스턴스의 정보를 저장하기 위해 메모리를 할당함
- 인스턴스가 더 이상 사용되지 않는다고 판단 → 메모리 해제
- 참조되는 프로퍼티의 갯수를 카운팅하여 모든 변수가 인스턴스를 해제하기 전에는 메모리에서 해제 안함
- 컴파일 시점에 동작한다.
- GC와의 차이점
- 컴파일 당시 이미 인스턴스의 해제 시점이 정해져 있음 (예측 가능)
- 위와 같은 이유로 인해 메모리 관리를 위한 시스템 자원을 추가할 필요가 없음
- Weak, unowned, Strong
- Strong (강한 참조)
- 객체를 소유하여 레퍼런스 카운트가 증가하는 프로퍼티
- Weak (약한 참조)
- 객체를 소유하지 않고 주소값만을 가지고 있는 포인터 개념
- 자신이 참조하지만 메모리를 해제시킬 수 있는 권한은 다른 클래스에 있음
- 값 지정시 리테인 발생 안함 → 언제 메모리가 해제될 지 알 수 없음
- 메모리가 해제될 경우 자동으로 레퍼런스가 nil로 초기화함 → 항상 옵셔널타입이여야 함
- Unowned(미소유 참조)
- nil이 될수가 없음 → 옵셔널타입 X
- 해제된 메모리 영역을 접근하지 않는다는 확실한 경우에만 사용
- Strong (강한 참조)
ARC 코드 예시
Person
class Person {
let name: String
init(name: String) {
self.name = name
println("\(name) is being initialized")
}
deinit {
println("\(name) is being deinitialized")
}
}
// Person 클래스 타입을 갖는 reference 변수 3개를 선언. 모두 옵셔널 변수이므로 초기값은 nil을 갖고 있습니다.
var reference1: Person?
var reference2: Person?
var reference3: Person?
//reference1 변수에 Person 인스턴스 생성하여 참조하게됩니다.
reference1 = Person(name: "John Appleseed")
//나머지 두 변수를 reference1를 참조하게 합니다.
reference2 = reference1
reference3 = reference1
/*이시점의 인스턴스에 대한 참조 횟수는 3이된다. 그런 후 reference1, reference2 참조 해지합니다.
그렇게 되면 Person 인스턴스에 대한 참조 횟수는 아직 1이어서 Person 인스턴스는 해지되지 않습니다.*/
reference1 = nil
reference2 = nil
/*
Pesron 인스턴스를 참조하고 있는 나머지 변수 refernce3의 참조 해지하면
더이상 Person 인스턴스를 참조하고 있는 것이 없으므로 ARC가 Person 인스턴스 메모리를 해지합니다.
*/
reference3 = nil