안녕하세요. 이번에는 두 번째 섹션 Reference Counting에 대해 서술해보겠습니다.
Reference Counting
- 대답은 Swift가 힙의 모든 인스턴스에 대한 총 Reference count를 유지한다는 것이다.
- Swift는 힙에 할당된 메모리를 언제 할당 해제하는 것이 안전한지 어떻게 알까?
- 그리고 인스턴스 자체에 유지한다.
- 참조를 추가하거나 참조를 제거하면 해당 참조 카운트가 증가하거나 감소한다.
- 그 수가 0에 도달하면 Swift는 아무도 더 이상 힙의 이 인스턴스를 가리키지 않는다는 것을 알고 해당 메모리를 할당 해제하는 것이 안전하다는 것을 알게 된다.
- 참조 카운팅에서 염두에 두어야 할 핵심 사항은 이것이 매우 빈번한 작업이며 실제로 정수를 증가 및 감소시키는 것보다 더 많은 것이 있다는 것이다.

- 첫째, 증가 및 감소를 실행하기 위한 몇 가지 수준의 간접 참조가 존재한다.
- 그러나 더 중요한 것은 힙 할당과 마찬가지로 여러 스레드가 힙 인스턴스에 참조를 동시에 추가하거나 제거할 수 있기 때문에 고려해야 할
thread safety
가 있다는 것이다. 실제로 참조 카운트를 원자적으로 증가 및 감소 시켜야 한다. - 그리고 참조 카운팅 작업의 빈도로 인해 이 비용이 증가될 수 있다.
- 이제
Point
를 Swift가 내부에서 어떻게 동작되는 지 살펴보자.

- 내부적으로 클래스에 refCount라는 프로퍼티가 만들어지고
- point1을 point2에 할당할 때 retain(point2) 메소드를 호출하여 point2가 해당 객체를 참고하고있다는 내용으로 refCount를 1 증가
- 그 뒤에는 사용이 끝나면 release 메소드를 통해 refCount를 1씩 감소하는 동작을 한다.
- 그 후에 Point의 refCount가 0이 된다면 힙 영역에서 해제된다.
그렇다면 구조체를 살펴보자.

- 구조체는 단순히 값 타입이기 떄문에 스택에 쌓는다!
- 해제되면 스택에서 해제되면 끝이다.
레퍼런스를 포함한 구조체는?

성능 지표




모델링 기술
이렇게 레퍼런스 카운트가 많을 경우 어떻게 바꿔야할 지 알아보자
- 해당 구조체에서는 모든 프로퍼티 타입들이 참조가 발생한다.
- 두 프로퍼티를
UUID
타입과 열거형으로 바꿔서 적용하면!? - fileURL만 참조한다.