Swift

3. iOS 메모리 관리(ARC, MRC)

Daesiker 2022. 7. 12. 17:36
반응형

1. 개요

iOS의 메모리 영역 중 힙영역을 관리하는 방법은 2가지가 있다. ARC와 MRC란 기법이 있는데 Objective-C에서는 프로젝트 설정을 통해 MRC나 ARC 중 선택하여 사용할 수 있고 Swift에서는 ARC만 사용한다. 이번 포스팅에서는 이 2가지 메모리 관리 기법에 대해 알아볼려 한다.


1-1. ARC(Auto Reference Counting)

ARC를 알아보기 전에 ARC가 어떤 메모리 영역을 관리하는 지 알아야한다. 바로 힙영역을 관리하는데 힙영역은 참조타입의 데이터를 관리하는 영역이다. 즉 클래스나 클로져를 메모리에 할당, 해제할 때 ARC를 사용한다

참조타입과 값타입 확인하기

ARC는 Auto Reference Counting의 약자로 힙영역에 할당돼있는 데이터를 참조하는 지역 변수들의 개수를 자동으로 카운팅을 하고 자신을 참조하는 지역변수가 없으면 자동으로 메모리를 해제하는 메모리 관리 기법이다.

-Source Code

class Human {
    var age:Int
    var name:String

    init(_ age: Int, _ name: String) {
        self.age = age
        self.name = name
        print("\(name) init")
    }

    deinit {
        print("\(name) deinit")
    }

}
//step 1
var human1:Human? = Human(28, "Daesik") // ARC : 1
var human2 = human1 // ARC : 2

//step 2
human1 = nil //ARC : 1

//step3
human2 = nil //ARC : 0

Step 1

맨 처음에 Human Instance인 지역 변수 human1을 생성함으로 써 힙영역에 실제 데이터가 할당되었고, 스택 영역에 해당 데이터의 주소값이 저장되있는 공간을 할당하였다. 그 다음 대입 연산을 통해 human1과 같은 데이터를 참조하는 human2를 생성하였다.

실제 데이터가 있는 힙영역을 참조 하는 지역변수는 총 2개이므로, RC는 총 2이다.

Step 2

지역변수 human1을 nil로 초기화를 해서 참조하는 주소값이 없으면 힙영역의 해당 주소값에 있는 RC가 1개 줄어든다. 이제 스택 영역에 해당 데이터를 참조하는 지역변수가 1개 있으므로 RC는 1이 된다.

Step 3

human2도 nil로 초기화하면서 힙영역에 있는 Human Instance를 참조하는 지역변수가 없으면, 해당 데이터를 해제한다. 여기서 RC가 0이 되면 메모리가 해제된 것을 알 수 있는데 지역변수를 생성하거나 대입연산을 통해 참조를 할 때 우리는 RC에 관해 아무런 동작을 취하지 않아도 RC가 자동으로 카운팅이 되는 것을 알 수 있다.

이 처럼 ARC는 특수한 함수 없이 자동으로 RC를 계산을 하는 메모리관리 방식이다. Swift는 모두 ARC를 통해 메모리 관리를 하며, Objective-C 언어는 MRC와 ARC 둘 중에 하나를 프로젝트 설정에서 채택할 수 있는데, 기본값은 ARC이다.


3-1. MRC(Menual Reference Counting)

MRC는 ARC와 반대로 수동으로 RC를 카운팅하는 것이다. 지역변수를 생성할 때는 retain이라는 함수를 써서 카운팅을 증가시키고, 지역변수를 초기화 할 때는 release라는 함수를 통해 RC를 직접 감소시켜야 한다. 해당 메모리 관리는 2011년 이전 Objective-C에서만 사용했던 기법으로 생성 혹은 초기화를 할 때마다 함수를 하나 씩 추가해야해서 코드가 복잡해지는 단점이 있다.

반응형