Swift

ARC와 MRC

pockpock 2024. 7. 9. 20:27
RC (Reference Counting)

 

ARC와 MRC에 들어가있는 RC는 메모리 관리 시스템의 핵심이 되는 개념임

인스턴스는 하나 이상의 참조자(소유자 = owner)가 있어야 메모리에 유지 된다.

 

만약 소유자가 없다면? -> 즉시 메모리에서 제거 됨

 

이때 인스턴스를 참조하고 있는 소유자의 개수를 RC(reference count)라고 한다.

 

이 말은?

 

reference count > 0 -> 메모리에 살아있음

reference count = 0 -> 메모라에서 삭제됨

 

그렇기 때문에, 더 이상 사용하지 않을 인스턴스의 RC가 0보다 크지 않도록 주의해야겠지?

움, 그럼 만약 0보다 크게되면 어떻게 되는거야?

 

그렇게 되면 메모리 누수가 발생함

순환 참조


실제로 "순환 참조(Circular Reference)"라는 것이 있는데

요게 뭐냐면, 두 인스턴스가 서로를 강하게 참조함으로써, 참조 카운트가 0이 되지않아

메모리에서 해제되지 않는 상황을 일컫는 말 임

 

이를 방지하기 위해

약한 참조(Weak Reference)와 미소유 참조(Unowned Reference)

이 두 친구를 활용 할 예정임


 

음음 역시 한 키워드를 알려면 내용이 굉장히 딥해지는군,,

자, 그러면 어차피 다음 내용들을 알기위해 강한참조와 약한참조를 알고있으면 이해가 쉬우니까

내용을 한번 다뤄볼까?

 

1. 강한 참조(Strong Reference)

기본적으로 모든 참조는 강한 참조임.

이 친구는 참조 카운트(RC)를 증가시킴

 

2. 약한 참조(Weak Reference)

딜리게이트 패턴 하면서 'weak'라는 키워드를 많이 사용했었죠?

같은거임. 약한 참조는 참조 카운트(RC)를 증가시키지 않음

-> 참조 대상이 메모리에서 해제될 때 자동으로 'nil'로 설정

 

3. 미소유 참조(Unowned Reference)

'unowned' 키워드를 사용하여 선언

미소유 참조는 참조 카운트를 증가시키는 않지만, 참조 대상이 해제된 후에도 'nil'로 설정되지 않는다.

따라서 런타임 오류의 위험이 있을수도 있음

 

Q -> 얘네를 Xcode에서 확인할 수 있나요?

네. 있습니다!

 

디버그 메모리 그래프

 

요거 활용하면 될 것 같은데 아직까진 잘 모르겠슴당

대충 굵은선이 강한 참조 얇은선이 약한 참조 라고 들었던 것 같은데

나중에 더 자세히 알아보도록 하죠?


ARC (Automatic Reference Counting)

 

ARC는 이름처럼 Swift에서 메모리 관리를 자동으로 처리하는 메커니즘임.

이 친구는 RC를 사용하여 인스턴스의 메모리 생명 주기를 관리하며, 인스턴스가 언제 메모리에서

해제 되어야 하는지를 결정함.

ARC는 컴파일 타임에 작동하며, 인스턴스가 더 이상 사용되지 않을 때

자동으로 메모리를 해제하여 메모리 누수를 방지함

 

플레이그라운드 ARC 구현

 

설명

14번 라인에 var ds: DS? = DS() 인스턴스가 생성되어 참조 카운트가 1이 된다

24번에 'ds'가 'nil'로 설정되어 참조 카운트가 0이되어

인스턴스가 메모리에서 해제 되어 "클래스 소멸" 프린트 출력이 된다.

 

MRC (Manual Reference Counting)

 

MRC 는 Objective-C 에서 사용하는 메모리 관리 시스템이다.

요 친구는 ARC가 도입되기 이전에 Objective0C에서 사용되었는데,

RC가 0이 되면 개발자가 명시적으로 메모리에서 해제시켜야 한다.

 

Q -> 그러면 ARC는 자동으로 RC를 카운팅해서 메모리를 관리해주는 시스템이니까,

개발자는 메모리 관리에 대해 신경 쓰지 않아도 되는거 아닌가요?

 

A-> 놉, ARC로 잡아내지 못하는 메모리 누수 상황이 발생할 수 있기 때문에

개발자는 메모리 관리 방법을 반드시 알아야 한다!

 

오늘 포스팅은 여기서 끝!