22-1. 자동 참조 카운팅(ARC)작동 개념과 동작

🌈 devleeky16498·2022년 4월 23일
0

스위프트는 앱의 메모리 사용량을 추적하고 관리하기 위해서 자동 참조 카운팅이라는 Automatic reference counting / ARC 를 사용한다. 이는 인스턴스가 더 이상 필요하지 않을 때 자동으로 클래스 인스턴스에 의해 사용된 메모리를 할당 해제한다. 클래스의 새로운 인스턴스가 생성될 때마다 ARC는 인스턴스에 대한 정보를 저장하기 위해서 메모리 청크에 이를 할당한다.

ARC의 개념

  1. 클래스에 새로운 인스턴스가 생성될 때마다 ARC는 인스턴스 정보를 저장하기 위해 메모리의 청크에 할당한다. 이는 관련된 프로퍼티 값과 함께 인스턴스 타입에 대한 정보를 가진다. 또한 인스턴스가 더 이상 필요하지 않을 때는 사용된 메모리를 할당 해제한다.
  2. 그러나 ARC가 아직 사용중인 인스턴스 할당을 해제하면 더 이상 인스턴스의 프로퍼티에 접근할 수 없거나 인스턴스 메서드를 호출할 수 없다. 그 때 앱은 크래시가 발생한다.
  3. 인스턴스가 여전히 필요한 동안은 사라지지 않도록 ARC는 얼마나 많은 프로퍼티, 상수, 변수가 각 클래스 인스턴스에 참조하는지 추적한다. 만약 이 중 하나라도 유효하다면 할당해제하지 안흔ㄴ다.
  4. 이것을 가능하게 하려면 프로퍼티, 상수 또는 변수에 클래스 인스턴스를 할당할 때마다 해당하는 프로퍼티, 상수 또는 변수들은 클래스 인스턴스에 대한 강한 참조를 만든다. 이는 해당 인스턴스를 유지하고 강한참조가 남아있는 한 할당 해제를 허용하지 않기 때문에 '강한' 참조라고 말한다.

ARC의 작동

  1. 다음의 예시 코드는 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에 대한 할당을 완전 해제한다.
profile
Welcome to Growing iOS developer's Blog! Enjoy!🔥

0개의 댓글