출처
value type과 달리 reference type은 하나의 인스턴스가 참조를 통해 여러곳에서 접근하기 때문에
언제 메모리에서 해제 되는지가 중요하다. 인스턴스가 적절한 시점에 메모리에서 해제되지 않으면 한정적인 메모리
자원을 낭비하게 되고, 이는 성능저하로 이어진다
Swift는 메모리 사용을 관리하기 위해 메모리 관리 기법인 ARC를 사용한다.
ARC(automatic reference counting)
자동으로 메모리를 관리해주는 방식. 더이상 필요하지 않은 클래스의 인스턴스를 메모리에서 해제하는 방식으로 동작한다.
인스턴스가 언제 메모리에서 해제되어야 할지를 컴파일과 동시에 결정함
ARC의 장단점
장점
- 컴파일 당시 이미 인스턴스의 해제 시점이 정해져 있어서 인스턴스가 언제 메모리에서 해제될지 예측 가능
- 메모리 관리를 위한 시스템 자원을 추가할 필요가 없다.
단점
- ARC의 작동규칙을 모르고 사용하면 인스턴스가 메모리에서 영원히 해제되지 않을 수 있다.
ARC의 작동 방식
클래스가 인스턴스를 생성할 떄 마다 ARC는 그 인스턴스에 대한 정보를 저장하기 위한 메모리 공간을 따로 할당한다.
그 메모리 공간에는 인스턴스 타입 정보와 함께 그 인스턴스와 관련된 저장 프로퍼티 값들을 저장합니다. 그후에 인스턴스가 더이상
필요없는 상태가 되면 차지하던 메모리 공간을 다른 용도로 활용할 수 있도록 ARC가 메모리에서 인스턴스를 없앤다.
ARC의 규칙
- 아직 더 사용해야 하는 인스턴스를 메모리에서 해제시키면 인스턴스와 관련된 프로퍼티에 접근하거나 인스턴스의 메서드를 호출할 수 없다.
- 게다가 인스턴스에 강제로 접근하려고 하면 잘못된 메모리 접근으로 인해 프로그램이 강제 종료 될 수 있다.
- 인스턴스가 지곳해서 필요한 상황에서 ARC는 인스턴스가 메모리에서 해제되지 않도록 인스턴스 참조 여부를 계속 추적한다.
- 다른 인스턴스의 프로퍼티나 변수, 상수등 어느 한곳에서 인스턴스를 참조한다면 ARC가 해당 인스턴스를 해제하지 않고 유지해야 하는 명분이 된다.
- 인스턴스를 메모리에 유지시키려면 이런 명분을 ARC에게 제공해야 한다.
'Swift > etc' 카테고리의 다른 글
[Swift] 메모리를 참조하는 방법(strong, weak, unowned) (0) | 2021.03.10 |
---|