250x250
반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

스윞한 개발자

iOS - ARC(Automatic Reference Counting) 본문

Swift 이론

iOS - ARC(Automatic Reference Counting)

스윞남 2024. 5. 7. 13:51
728x90
반응형
SMALL

안녕하세요! 오랜만에 포스팅을 하는데.. 시험 기간, 공모전 준비에 4월이 정신없이 지나간 거 같아요..

 

다시 열심히 포스팅 해보겠습니다!

 

 

오늘 정리할 내용은 ARC! Automatic Reference Counting, 자동 참조 계수입니다. 

저도 프로젝트를 진행하면서 강한 참조 약한 참조 많이 보고 사용도 해보았는데요! 언제 어떻게 왜 쓰는지는 정확하게 몰랐습니다! 

 

이번 시간을 통해 더 자세히 제대로 알아보겠습니다!

 

ARC에 대해 알아보기 전에 RC(Reference Count)에 대해서 한번 정리해 보겠습니다. 

 

728x90

#RC

인스턴스를 참조하는가 안 하는가를 숫자로 표현한 것입니다. 컴파일 타임에 언제 참조되고 해제되는지 결정되며, 런타임 때 그대로 실행됩니다. 

* 장점 : 개발자가 참조 해제 시점을 파악 가능, 런타임 때 추가 리소스 발생 X

* 단점 : 순환 참조가 발생할 경우, 영구적으로 메모리가 해제되지 않을 수 있음

 

간단하게 RC가 무엇인지 정리해 보았습니다. 이제 ARC를 들어가기 전에 MRC에 대해 혹시 들어보셨나요? 

 

#MRC

MRC란, Obj-C를 사용할 때에는 retain, release, autorelease 등을 통해서 수동적으로 메모리를 관리했습니다. 

(Manual Reference Counting)

 

retain(retain Count). 즉, reference Count 참조 증가를 통해 현재의 객체가 유지되는 것을 보장시키고! release(retain Count). 다시 이 참조 감소를 시켜 retain후 필요 없을 때는 release를 해주며 수동적으로 이 메모리에 대해 관리를 해줬습니다!

 

참 귀찮고,, 쉽지 않은 작업이었던 것 같습니다. 하지만! 또 이렇게 번거로움을 줄이고자 2011 WWDC에서 자동으로 메모리 참조에 대해 계산/관리해 주는!! ARC가 등장하게 되었습니다. 

 

그래서 Swift에서는 ARC를 통해 메모리 관리는 하게 되었습니다. 

# ARC

ARC(Automatic Reference Counting)

Reference Count. 참조 횟수를 계산하여 참조 횟수가 0일 경우, 더 이상 사용하지 않는 메모리라 생각하여 해제합니다.

 

Compile Time에 자동으로 retain, release를 적절한 위치에 삽입하여 수동적으로 관리하던 것을 효율적으로 관리할 수 있게 된 것입니다.

 

ARC는 자동으로 retain, release를 코드에 삽입해 이 참조계수를 관리하고, 0이 될 때 deinit을 호출해서 메모리를 해제를 시켜줍니다!

 

* 동적 할당으로 object가 생성되면 해당 정보는 HeapObject라는 구조체로 관리

* HeapObject 안에는 참조 계수 포함

* class에 대한 HeapObject를 통해 참조 계수 관리 가능

 

기본적으로 클래스의 객체를 가리키는 각각의 참조는 강한 참조입니다. 

(최소한 하나 이상의 강한 참조가 있는 한 이 객체는 메모리는 해제되지 않습니다. 즉, 객체에 대한 강한 참조가 존재하지 않는다면 메모리에서 해제됩니다.)

 

# 순환 참조

두 객체가 서로가 서로를 참조하고 있는 형태를 순환 참조라고 합니다. 순환 참조가 발생 시 영구적으로 메모리가 해제되지 않을 수 있습니다. 하지만 강한 참조 Strong으로 선언된 변수들이 순환 참조가 됐을 경우 RC가 0이 되지 못하면서 "강한 순환 참조"가 발생할 수 있습니다. 이 경우 메모리 누수(Memory Leak)가 발생할 수 있습니다. 이러한 문제가 발생하는 것을 막기 위해 이 연결 상태를 strong, weak, unowned으로 상황에 맞게 결정할 수 있는데 이것이 바로 Retain Cycle입니다.

 

 

위의 표와 같이 

 

1. Strong

인스턴스의 주소값이 변수에 할당될 때 RC가 증가하면 강한 참조입니다. default값이기도 합니다.

 

2. Weak

인스턴스를 참조할 경우 RC를 증가시키지 않습니다. 인스턴스가 메모리에서 해제된 경우 자동으로 nil이 할당되어 메모리가 해제됩니다.

weak(약한 참조)는 무조건 옵셔널 한 타입의 변수여야 합니다.

 

3. Unowned

미소유 참조 unowned은 weak와 같이 강한 순환참조를 해결할 수 있고, RC를 증가시키지 않습니다. 하지만 옵셔널의 강제 언래핑처럼 메모리에서 해제된 경우 nil을 할당받지 못하고 해제된 메모리 주소값을 계속 들고 있습니다. 그렇기에 미소유 참조로 선언된 인스턴스가 해제되었는데 접근하게 될 경우 런타임 에러가 발생할 수 있습니다.

 

 

이번 시간에는 ARC에 대해 공부하며 정리해 보았습니다!

 

잘못된 점이나 부족한 점에 대한 피드백은 언제나 환영입니다. 다음 포스팅에는 더 양질의 포스팅으로 찾아오겠습니다!

 

 

아래의 글들을 참고해 작성되었습니다.


https://www.thomashanning.com/retain-cycles-weak-unowned-swift/

 

Retain Cycles, Weak and Unowned in Swift

Memory management, retain cycles and the usage of the keywords weak and unowned are a little bit confusing. On the other hand it’s very important to understand this topic properly because retain cycles are one of the major reasons for memory problems.

www.thomashanning.com

https://leeari95.tistory.com/21

 

[Swift/iOS] 메모리를 관리해주는 ARC에 대해 알아보자.

🔍 Swift는 메모리 관리를 어떻게 할까? ARC(Automatic Reference Counting)를 사용한다. 🔍 RC(Referenc Count)란 무엇인가? 인스턴스를 현재 누가 가르키고 있느냐 없느냐(참조하냐 안하냐)를 숫자로 표현한

leeari95.tistory.com

https://wodyios.tistory.com/8

 

[Swift] 메모리 관리하기

오늘은 Swift로 메모리관리를 어떻게 하는지에 대해서 간단하게 적어볼게요!! 아래의 목차를 따라 적어보았습니다! Swift에서의 메모리 관리 Retain cycle Weak 키워드 Retain cylce in Delegate Retain cycle in Clo

wodyios.tistory.com

 

728x90
반응형
LIST

'Swift 이론' 카테고리의 다른 글

Combine 알아보기  (0) 2024.08.05
iOS - LLDB  (2) 2024.04.18
iOS - 앱 생명주기(Lifecycle)  (0) 2024.04.17
Swift - ModernCollectionView  (0) 2024.04.14
Swift - CompositionalLayout  (2) 2024.04.13