[iOS / Swift] iOS 메모리 관리 (ARC)

프린스송·2021년 6월 2일
2

iOS 앱 개발

목록 보기
7/23
post-thumbnail

안녕하세요!! 저번 포스팅까지는 가장 중요한 Object인 UILabel이랑 UIButton을 공부해보았습니다. 오늘은 iOS에서 메모리를 관리하는 ARC에 대해서 알아보겠습니다. 그럼 더 자세히 알아보죠!


ARC

ARC는 Automatic Reference Counting의 약자로 자동 참조 계수라고 합니다. 즉 iOS에서 앱의 메모리 사용을 자동으로 추적하고 관리해주는 것이라고 이해하면 쉬울 겁니다.

우리가 코드를 짜다가 서로 참조하는 관계를 만들 수 있고 만약 그렇게 만든 인스턴스들이 더 이상 필요하지 않는다면 ARC가 자동적으로 메모리를 해제 해줍니다! (너무 편리하거 아닌가..!) 하지만 ARC는 자동적으로 메모리를 관리해주기 때문에 평소에 코드를 작성하면 이것이 잘 작동되는지 시각적으로 알기 힘들다고 하네요. 그래서 간단한 코드를 작성해 알아보겠습니다.

class Person {
    let name: String
    
    init(name: String) {
        self.name = name
        print("\(name) 이 초기화됨")
    }
    deinit {
        print("\(name) 이 해제됨")
    }
}

이런 코드를 작성해보죠. Person 클래스를 만들고 프로퍼티인 name을 하나 만들었습니다. 그리고 예전 Class 포스팅에서 배웠던 init (초기화) 함수도 넣었구요. 그리고 deinit이라는 함수도 하나 새로 나왔는데 뭔가 init과는 반대되는 뜻이겠지요??

deinitializer(소멸자) : 클래스 인스턴스의 메모리가 해제되었을 때 즉시 호출되는 함수 (deinit)

위의 코드 상태에서 다음과 같은 코드로 인스턴스를 하나 만들어 보겠습니다.

var reference1: Person? = Person(name: "Song")

그리고는 playground에서 실행을 해보죠!
init함수로 인해서 초기화가 된것을 알 수 있습니다. 그리고 여기서 알 수 있는 점은 새로운 Person 인스턴스가 reference1 변수에 할당되었기 때문에, reference1에 새로운 Person 인스턴스가 강한 참조(strong)로 됩니다. 이렇게 되면 현재 강한 참조가 하나 이상이기 때문에 ARC는 Person 이 메모리에서 유지되고 할당 해제되지 않도록 한다고 하네요!

그렇다면 이제 다른 두개의 변수에 reference1을 복사를 해보겠습니다.

var reference2: Person? = reference1
var reference3: Person? = reference1

reference1 = nil
reference2 = nil

위 코드와 같이 새로운 변수 reference2과 reference3를 만들고 reference1를 복사해서 할당해 주었습니다. 그리고는 처음의 reference1과 reference2를 nil로 바꾸어준다면 1,2에 대해 메모리는 해제가 되지만 reference3에 대한 메모리는 해제가 되지 않게 되겠죠! 그래서 deinit(소멸자)에 대한 내용은 실행이 안되다가..

reference3 = nil

다음과 같이 마지막 변수 reference3에 nil을 할당해서 메모리를 해제를 시켜준다면 어떤 일이 일어날까요?
이렇게 모든 메모리 참조가 소멸이 되어서 소멸자 함수가 실행돼 출력문이였던 "Song이 해제됨"이 잘 출력되는 것을 볼 수 있습니다.

한마디로 정리를 해보자면 ARC는 인스턴스의 강한 참조가 남아있는 한 메모리를 해제하지 않고 모든 강한 참조들이 없어질때 메모리를 해제합니다.

이렇게 모든 인스턴스에 대한 강한 참조가 다 없어진다면 ARC는 자동으로 메모리를 해제해 준다는 사실을 알았습니다. 제가 C언어를 공부할때는 코드를 작성하여 메모리 관리를 직접했었는데 이렇게 swift에는 ARC가 있어 편하게 메모리 관리를 할 수 있겠군요!


오늘은 메모리를 자동적으로 관리해주는 ARC에 대해 공부를 해보았습니다. 이런 사소하고 눈에 보이지 않는 것일 수록 기초적인 것을 배우는데 별로 중요하지 않다고 생각될 수 있지만 나중에 더 복잡하고 어려운 작업을 할수록 이러한 지식이 꼭 필요할 것이라고 생각이 듭니다! 다음 포스팅에서는 메모리의 참조에 대해서 공부를 해보겠습니다. 그럼 오늘 하루도 수고많으셨습니다~

profile
[iOS / Swift] [React Native]

0개의 댓글