일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 반응형
- uikit
- 디자인 패턴
- collectionview
- WeatherKit
- swift
- 기초문법
- forEach
- SwiftUI
- 세종대학교
- 프로토콜
- 이론
- 앱개발
- 구름톤 유니브
- 스트럭트
- CS
- 딕셔너리
- AppStore
- MVVM
- 토이프로젝트
- 실습
- ios
- 네트워크
- 대표
- 협업
- RxSwift
- 학과별커뮤니티
- mvc
- struct
- async
- Today
- Total
스윞한 개발자
iOS - ARC(Automatic Reference Counting) 본문
안녕하세요! 오랜만에 포스팅을 하는데.. 시험 기간, 공모전 준비에 4월이 정신없이 지나간 거 같아요..
다시 열심히 포스팅 해보겠습니다!
오늘 정리할 내용은 ARC! Automatic Reference Counting, 자동 참조 계수입니다.
저도 프로젝트를 진행하면서 강한 참조 약한 참조 많이 보고 사용도 해보았는데요! 언제 어떻게 왜 쓰는지는 정확하게 몰랐습니다!
이번 시간을 통해 더 자세히 제대로 알아보겠습니다!
ARC에 대해 알아보기 전에 RC(Reference Count)에 대해서 한번 정리해 보겠습니다.
#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/
https://leeari95.tistory.com/21
'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 |