(IBOutlet 선언할 때 weak을 왜 붙이는 걸까 알아보다가.. 여기까지 오게되었음)
매번 전달할 때마다 값을 복사해 전달하는 값 타입과는 달리,
참조 타입은 하나의 인스턴스가 참조를 통해 여러 곳에서 접근하기 때문에 언제 메모리에서 해제되는 지가 중요한 문제이다.
인스턴스가 적절한 시점에 메모리에서 해제되지 않으면 메모리 자원을 낭비하게 되며, 이는 성능 저하로 이어진다.
그래서 스위프트는 프로그램의 메모리 사용을 관리하기 위해 메모리 관리 기법인 ARC를 사용한다.
ARC와 값 타입
ARC가 관리해주는 참조 횟수 계산 (Reference Counting) 은 참조 타입인 클래스의 인스턴스에만 적용된다.
구조체, 열거형은 값 타입으로 참조 횟수 계산과 무관 ➡️ 구조체, 열거형은 다른 곳에서 참조하지 않으므로 ARC에서 관리할 필요가 없다.
ARC (Automatic Reference Counting) 란?
자동으로 메모리를 관리해주는 방식 ➡️ 프로그래머가 메모리 관리에 신경을 덜 써도 되므로 편리함.
ARC는 더 이상 필요하지 않은 클래스의 인스턴스를 메모리에서 해제하는 방식으로 동작한다.
가비지 컬렉션과는 다르게, ARC는 인스턴스가 언제 메모리에서 해제되어야 할 지를 컴파일과 동시에 결정한다.
장점
1. 컴파일 당시 이미 인스턴스에 해제 시점이 정해져 있어서 인스턴스가 언제 해제될 지 예측할 수 있다.
2. 메모리 관리를 위한 시스템 자원을 추가할 필요가 없다.
단점
1. ARC의 작동 규칙을 모르고 사용하면 인스턴스가 메모리에서 영원히 해제되지 않을 가능성이 있다.
클래스의 인스턴스를 생성할 때마다 ARC는 그 인스턴스에 대한 정보를 저장하기 위한 메모리 공간을 또 할당한다.
그 메모리 공간에는 인스턴스의 타입 정보와 함께 그 인스턴스와 관련된 저장 프로퍼티의 값 등을 저장한다.
그 후 인스턴스가 더 이상 필요 없는 상태가 되면 인스턴스가 차지하던 메모리 공간을 다른 용도로 활용할 수 있도록 ARC가 메모리에서 인스턴스를 없앤다.
그런데 만약 아직 더 사용해야 하는 인스턴스를 메모리에서 해제시킨다면 인스턴스와 관련된 프로퍼티에 접근하거나 인스턴스의 메소드를 호출할 수 없다.
게다가 인스턴스에 강제로 접근하려고 하면 잘못된 메모리 접근으로 인해 프로그램이 강제 종료될 확률이 크다.
인스턴스가 지속해서 필요한 상황에서 ARC는 인스턴스가 메모리에서 해제되지 않도록 인스턴스 참조 여부를 계속 추적한다.
다른 인스턴스의 프로퍼티나 변수, 상수 등 어느 한 곳에서 인스턴스를 참조한다면 ARC가 해당 인스턴스를 해제하지 않고 유지해야 하는 명분이 된다. 인스턴스를 메모리에 유지시키려면 이런 명분을 ARC에 제공해야 한다!
'swift' 카테고리의 다른 글
[swift] ARC | 약한참조 (weak) (0) | 2020.06.11 |
---|---|
[swift] ARC | 강한참조 (Strong) (0) | 2020.06.11 |
[swift] 데이터 타입 | Any, AnyObject (0) | 2020.06.08 |
[swift] 스위프트의 언어적 특성 2. 함수형 (0) | 2020.06.08 |
[swift] 스위프트의 언어적 특성 1. 객체지향 (0) | 2020.06.08 |