스위프트는 앱의 메모리 사용량을 추적하고 관리하기 위해서 자동 참조 카운팅이라는 Automatic reference counting / ARC 를 사용한다. 이는 인스턴스가 더 이상 필요하지 않을 때 자동으로 클래스 인스턴스에 의해 사용된 메모리를 할당 해제한다. 클래스의 새로운 인스턴스가 생성될 때마다 ARC는 인스턴스에 대한 정보를 저장하기 위해서 메모리 청크에 이를 할당한다.
class Person {
let name : String
init(name : String) {
self.name = name
print("\(name) is being made)")
}
deinit {
print("\(name) is faded")
}
}
//다음과 같이 Person 클래스를 생성하며 이 때, 생성자와 해제자를 선언해준다.
//이어지는 코드는 Person의 인스턴스에 여러개 참조를 생성한다. 하지만 이는 옵셔널로,
//nil로 자동 초기화 되며 현재는 인스턴스를 참조하지 않는다.
var ref1 : Person?
var ref2 : Person?
var ref3 : Person?
//이제 새로운 인스턴스를 생성하고 3개의 변수중 하나에 할당한다.
ref1 = Person(name : "John")
//John is being made가 출력된다. 이는 초기화가 발생했음을 알린다.
//새로운 Person인스턴스는 ref1 변수에 할당되었으므로 서로간의 강한 참조를 가진다.
//그리고 ARC는 이를 메모리에 유지하고 할당한다.
//이어지는 코드는 동일한 인스턴스를 2개 이상의 변수에 할당한다.
//2개의 강한참조가 설정된다.
ref2 = ref1
ref3 = ref1
//이제 Person이라는 단일 인스턴스에 대한 3개의 강한 참조가 있다.
//이어지는 코드에서는 기존 참조를 포함하여 2개의 변수에 nil을 할당하여, 하나의 강한참조만 남긴다.
ref1 = nil
ref2 = nil
//여기까지도 하나의 강한참조가 남는다.
ref3 = nil
//모든 인스턴스를 해제했을 때 Person에 대한 할당을 완전 해제한다.