우리가 Swift를 사용할 때 인스턴스 클로저 등의 참조타입은 자동적으로 힙에 할당되어 사용되었다.
class Human {
var name: String?
var age: Int?
init(name: String?, age: Int?) {
self.name = name
self.age = age
}
}
let sodeul = Human(name: "sodeul", age: 26)
Human이라는 클래스를 우리가 인스턴스를 생성하고 초기화했을 때 다음과 같이 할당된다.
스택 영역에 먼저 지역 변수가 할당되고 실질적인 Human 클래스의 인스턴스들은 힙영역에 할당되게 된다.
스택 영역에 있는 지역 변수에는 힙영역의 인스턴스들의 주소값이 저장된다.
다른 언어에서 참조값을 다루어 보았다면 알다시피 다른 변수에 sodeul값을 복사하면
Human 클래스의 인스턴스가 아닌 주소값을 복사하는 것은 알 것이다.
C/C++에서 동적할당을 했을 경우 힙영역에 메모리 할당을 한 후 메모리를 해제해 주어야 하는데 Swift에서는 ARC라는 게 대신 해제해 준다고 한다. (자바의 garbage collection 같다)
GC(Garbage Collection) vs ARC(Automatic Reference Counting)
MRC vs ARC
MRC는 2011년 이전의 Objective-C가 사용했다고 한다.
(구시대적인 유물...?)
ARC 메모리 관리 방법
ARC에서 RC인 Reference Count 즉 참조 횟수를 세는 방법으로 메모리를 자동으로 해제한다는 것이다.
스택영역에서 힙 영역의 인스턴스 주소값이 복사된 횟수만큼 카운트한다는 것이다.
이 개념이 유닉스 시스템에서 파일을 관리할 때 사용하는 시스템 콜 link, unlink 원리와 비슷한 것 같다.
(OS가 유닉스에서 파생되어서 그런가.. 비슷하네?)
해당 설명들은 참고한 사이트에서 가져온 예제들이다.
# 참고한 사이트
'iOS > 문법' 카테고리의 다른 글
Swift 문법과 친해지기 - MRC/MMR(Objective-C 잔재) (0) | 2023.01.07 |
---|---|
Swift 문법과 친해지기 - Strong, Weak, unowned, 순환 참조 (0) | 2023.01.07 |
Swift 문법과 친해지기 - 패턴 (0) | 2023.01.06 |
Swift 문법과 친해지기 - 제네릭 (0) | 2023.01.06 |
Swift 문법과 친해지기 - protocol (0) | 2023.01.04 |