본문 바로가기
Swift

[iOS] About ARC(Automatic Reference Counting)

by dsungc 2024. 10. 5.

이번 게시글에선 ARC! 에 대해 알아보겠습니다.

Swift의 메모리 관리 모델 ARC

Swift에선 개발자가 메모리 관리를 일일이 신경쓰지 않아도 되도록 ARC를 사용해 자동으로 메모리를 관리합니다. 

하지만 앞으로 소개해드릴 순환참조와 같은 메모리 누수 문제를 피하기 위해선 여전히 개발자들이 신경써야할 부분들이 있기에 이부분과 ARC를 함께 글을 적어보려 합니다.

 

그럼 우선..

 

ARC

Automatic Reference Counting의 약자입니다.

의미 역시 영어 그래도 받아들여 주시면 되는데요, 자동으로 참조 횟수를 세어주는 기능입니다.

참조라는 단어가 들어간 것으로 보아 값타입인 struct, enum엔 해당이 되지 않을 것 같고, class, 클로저에 해당될 것 같죠?

또한, class와 클로저에 해당하는 것을 보아하니 메모리 영역 중 Heap 영역을 관리해 주는 것 같습니다.

(참조타입의 경우 스택 영역에 해당 포인터-인스턴스 주소값이 할당, 힙 영역에 인스턴스 할당)

그렇다면 왜 이 기능을 도입했을까요?

 

기본적으로 인스턴스가 생성되면 참조 카운트가 +1이 됩니다. 반대로 해제되면 -1이 되는것이죠.

또한 해당 인스턴스에 대한 참조 카운트가 0이 되면 메모리에서 그 인스턴스를 해제합니다.

 

그런데 말로만 들으면 참 쉬운 이 과정을 과거엔 하나하나 다 코드로 구현해줬어야 한다고 합니다....

인스턴스의 기본 메서드인 retain release를 사용해서 말이죠..

그런데? 

이러한 기능을 자동으로!!

그러니까 힙에 할당된 인스턴스 메모리를 알아서 관리하는게 바로 ARC!!

(이전의 기술을 MRC라고 합니다.)

 

순환 참조?

ARC는 일반적으로 메모리 누수를 방지해주지만, 클래스 인스턴스가 서로를 강하게 참조하거나 클로저에서 인스턴스를 캡쳐할 때 바로 이 순환 참조 문제는 해결해주지 못합니다.

순환참조라는 앞서 말씀드린 상황에서 메모리를 해제했을 때, 참조 카운팅이 남아있어 메모리가 해제되지 않는 상황입니다.

 

weak, unowned

그러면 이를 해결하려면?

사실 사용 자체는 간단합니다.

변수 선언시 앞에 weak 나 unonwed만 붙여주면 끝나는데요,

그럼 이 두가지는 무엇이 다른지 살펴보겠습니다.

 

우선 weak!!!

말 그래도 약한 참조를 위한 키워드입니다.

우리가 평소에 사용하던 것은 강한 참조였는데요, 이 키워드를 통해 약한 참조를 통해 인스턴스 참조 시, RC를 증가시키지 않는 것입니다. 

또한 참조하던 인스턴스가 메모리에서 해제될 경우, 자동으로 nil이 할당되어 메모리가 해제되는 것이 핵심입니다.

 

그럼 unowned는?

사실 기능은 weak와 비슷한데, weak은 인스턴스가 메모리에서 해제되는 경우에 사용하지만 unowned는 인스턴스가 메모리에서 사라질 일이 없다고 확신하는 경우 사용합니다.

만약 unowned로 선언된 변수가 가리키던 인스턴스가 메모리에서 사라지면..? >> 에러가 발생하는 것이죠

음.. 한 번 더 생각해보고 사용해야할 녀석인 것 같습니다.. 에러가 날 확률도 있기에 더더욱..

 

코드나 그림없이

제 머릿속에 있는 개념들을 주저리주저리 떠들어보는 느낌으로 작성해보았습니다

설며이 쬐끔 부족할지도..? 글도 좀 짧은 것 같네요 ㅎ

아무튼!!!

여기까쥐~

.

.

.

.

 

 

 

'Swift' 카테고리의 다른 글

[iOS] About Cookie/Session  (0) 2024.10.13
[iOS] About CoreData  (0) 2024.10.13
[iOS] About Optional(옵셔널)  (0) 2024.10.01
[iOS] About Copy-On-Write(COW)  (0) 2024.09.28
[iOS] About DI, DIP  (2) 2024.09.26