Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ARC는 어느 시점에 작동하나요? #25

Open
youn9k opened this issue Jan 4, 2025 · 3 comments
Open

ARC는 어느 시점에 작동하나요? #25

youn9k opened this issue Jan 4, 2025 · 3 comments

Comments

@youn9k
Copy link
Collaborator

youn9k commented Jan 4, 2025

  • 컴파일타임과 런타임에 동작함을 얘기한다
  • 각 타임에서 진행되는 방식에 대해 설명한다
@hsw1920
Copy link
Owner

hsw1920 commented Jan 10, 2025

Q. ARC는 어느 시점에 작동하나요?
A.
ARC는 Swift에서 Heap 영역의 메모리를 관리하기 위한 기법입니다.
ARC는 참조 횟수인 Reference Count가 0이되면 메모리를 해제하는 방식으로 작동합니다.
Referece Count는 클래스 인스턴스와 같은 참조 변수가 참조될 때 1 증가하게 됩니다.
예를들어 지역변수를 통해 어떤 클래스의 인스턴스를 참조했다면, 지역변수는 스택영역에 저장되며 힙영역에 존재하는 클래스 인스턴스이 주소값을 참조하게 됩니다. 이때 참조되는 클래스 인스턴스의 Reference Count는 1 증가하게 됩니다. 지역변수가 스택 영역의 임시 메모리에서 해제되면 해당 지역변수가 참조하고 있던 클래스 인스턴스의 Reference Count가 1 감소하여 0이되어 클래스 인스턴스도 힙 영역에서 메모리 해제가 되는 방식으로 ARC가 동작하게 됩니다.
이처럼 ARC는 참조 카운트인 Reference Count가 계산되는 시점에 작동합니다.

답변의도

  • ARC의 동작 원리를 참조 카운트(Reference Count)와 관련지어 설명한다.
  • 참조 카운트가 계산되는 시점에 ARC가 동작함을 설명한다.

추가 설명

참조 횟수가 증가하는 시점

  • 인스턴스의 주소값(힙영역에 저장되는 클래스 인스턴스)을 변수(지역변수)에 할당할 때
  • 기존 인스턴스를 다른 변수에 대입할 때

참조 횟수가 감소하는 시점

  • 인스턴스(힙영역의 클래스 인스턴스)를 가리키던 변수(지역변수)가 메모리에서 해제될 때
  • nil이 지정되었을 때
  • 변수에 다른 값을 지정했을 때
  • (프로퍼티의 경우)속해 있는 클래스 인스턴스가 메모리에서 해제될 때

@Kiyoung-Kim-57
Copy link
Collaborator

ARC는 컴파일 시점에 메모리 관리 명령어인 release/retain/autorelease를 삽입해 메모리 관리를 합니다. 이를 통해 자동으로 참조 카운팅을 할 수 있고 개발자가 수동으로 할 필요가 없어집니다.
하지만 온전히 컴파일 시점에서 작동하고 끝나는 것은 아닙니다.
런타임에서 ARC는 삽입된 메모리 명령어에 따라 참조 카운트를 카운팅하고 0이 되었을 때 자동으로 메모리를 해제합니다.
그래서 ARC는 컴파일 시점과 런타임 시점 모두 작동하는 메모리 관리 시스템입니다.

@0Hooni
Copy link
Collaborator

0Hooni commented Jan 11, 2025

ARC는 컴파일타임과 런타임 모두에서 동작합니다.

컴파일 시점에서는 우선 코드를 분석하여 자동으로 retain, release와 같은 메모리 할당, 해제 명령어를 적절한 위치에 삽입하여 메모리 관리가 동작되도록 합니다.

추가적으로 런타임에서는 레퍼런스 카운트의 변경을 확인하여 카운트가 0일 때 ARC가 동작하여 메모리 관리를 해주게 됩니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants