Swift: Side Table

틀틀보·2025년 5월 16일

Swift

목록 보기
8/19

ARC 시스템에서 weak 참조를 효율적이고 안전하게 관리하기 위해 도입된 구조

Swift의 객체

  • 객체는 strong, weak, unowned 세 가지 참조 방식을 가진다.
  • 이들 중 weak 참조만이 nil 값을 가질 수 있다.

Side Table

weak 참조되기 이전


객체는 생성과 동시에 자신의 Reference Counter를 가지며 ARC가 관리할 수 있게 한다.
⚠️다만 이때까지는 Side Table은 생성되지 않는다.

weak 참조된 후


이제 생성된 객체를 다른 변수나 상수가 weak참조를 하면 Side Table이 생성되고 해당 객체의 weak 참조를 관리

⚠️이때, strong, unowned 참조는 여전히 객체를 직접 가리키고 weak 참조만이 Side table을 가리킨다.
Side Table은 이제부터 weak, strong, unowned 참조 횟수를 가지고 있음. 기존 객체는 pointerSide Table을 가리킴.
참조 횟수참조는 다른 느낌

왜 weak 참조만 Side Table을 가리킬까?

  1. 안전한 자동 nil 설정
    weak 참조는 참조 대상이 해제되면 자동으로 nil이 되어야 함.
    Side Table에 등록된 weak 참조를 모두 찾아 nil로 설정해 해제된 객체에 대한 접근 방지
  2. 모든 객체가 weak 참조를 가지지 않음
    모든 객체에 weak 참조 카운트를 저장하는 건 비효율적이므로 weak 참조되었을 때만 weak 참조를 따로 관리
  3. 스레드 안전성
    다중 스레드 환경에서 객체의 해제와 weak 참조의 nil 설정이 동시에 발생 가능
    Side Table의 원자적 연산으로 스레드 간 경쟁 방지
  4. 객체 자체가weak 참조를 관리 시 복잡한 동기화 필요

필자의 간단한 정리

  • weak참조로 할당한 변수, 상수들을 한번에 찾아 nil로 쉽게 바꾸기 위함?

출처
https://alexdremov.me/dive-into-swifts-memory-management/

https://nsvasilev.medium.com/memory-management-with-swift-arc-strong-weak-and-unowned-explained-cbaae59ccf21

profile
안녕하세요! iOS 개발자입니다!

0개의 댓글