reference : https://onelife2live.tistory.com/10
스택 (Stack) 에 저장되는 메모리는 자동으로 제거되기 때문에 특별한 관리를 필요로 하지 않는다. 하지만 힙 (Heap) 에 저장되는 메모리는 필요하지 않는 시점에 따로 제거를 해주어야 한다. 메모리 관리 모델 (ARC, MRC)는 힙의 메모리를 관리한다.Value Type: Structure, Enumeration, Tuple
Reference Type: Class, ClosureValue 타입은 스택에, Reference 타입은 힙에 저장되는데, 여기서 구조체와 클래스의 차이점을 한번 느낄 수 있다.
MRC (Manual Reference Counting)
말그대로 직접 레퍼런스 카운팅하는 방식. 개발자가 직접 메모리 관리 코드를 작성해야 한다. 인스턴스의 기본 메서드인 retain과 release를 사용한다.
상대적으로 코드 길이가 길어지고, 휴먼 에러 가능성이 높아진다. 즉 프로그램의 안정성이 낮아진다.C++ 에 비유하면 일일히 delete 코드를 작성해야 하는 것과 비슷
ARC (Automatic Reference Counting)
컴파일러가 자동으로 레퍼런스 카운팅 하는 방식. 코드 양이 적어지고, 프로그램의 안정성이 높아진다.Objective-C : MRC, ARC
Swift : ARC
인스턴스는 하나 이상의 소유자 (Owner)가 있어야 메모리에 유지된다. 소유자가 없다면 즉시 메모리에서 제거된다. 제거 시점을 파악하기 위해 소유자의 수를 저장하는데 이것을 Reference Counting 이라고 한다.
참조 카운팅이 1이상이면 메모리에 유지, 0이되면 메모리에서 제거된다.
retain
클래스 인스턴스를 변수에 저장하면 변수가 소유자가 되고, reference counting이 1이된다. 이 상황에 클래스 인스턴스를 다른 변수에 한번 더 저장하면 2가 되는 것이다.release
클래스 인스턴스를 저장한 변수에 nil을 저장하게 되면 소유권을 포기하는 것과 같다. 클래스 인스턴스 변수가 모두 소유권을 잃게 되면, reference counting도 0으로 줄어들고 메모리에서 완전히 제거된다.Swift 코드 예시
var Person1: Person? var Person2: Person? var Person3: Person? person1 = Person(name: "KSW") person2 = person1 person3 = person1 // reference counting = 3 person1 = nil // reference counting = 2 person2 = nil // reference counting = 1 person3 = nil // reference counting = 0 // 메모리 인스턴스 해제.