ARC #1

dvhuni·2021년 4월 14일
0

iOS

목록 보기
3/4

안녕하세요, dvHuni 입니다 !

iOS 관련 게시글은 오랜만이네요 😅

~~(이번 글을 위해 열심히 공부했다고 생각해주세요 .. )~~

오늘은 swift를 공부한 사람이라면! 사용하는 사람이라면! 한번쯤 들어봤을 ARC!

도대체 ARC가 무엇인지 ! 어떻게 동작하는지 ! 한번 알아보겠습니다.

고고 👨🏻‍🏫

  • 본 글은 swift docs를 참조하여 개인의 이해를 적은 글입니다. 🤓

What is ARC?

ARC(Automatic Reference Counting) : To track and manage your app’s memory usage

In most cases, this means that memory management “just works” in Swift, and you do not need to think about memory management yourself.
ARC automatically frees up the memory used by class instances when those instances are no longer needed.

메모리 관리에 대해 생각할 필요가 없게 만듭니다!

Reference counting applies only to instances of classes.
Structures and enumerations are value types, not reference types, and are not stored and passed by reference.

  • RC는 클래스의 인스턴스에만 적용됩니다. Structure와 Enumration은 Value Type이기 때문에 RC가 적용되지 않습니다. (Class And Struct참조)

How to work

클래스의 인스턴스를 생성할 때 마다 ARC는 인스턴스의 정보를 저장하기 위해 메모리를 할당합니다.

이 메모리는 인스턴스의 타입, 연관되어있는 property들 또한 함께 저장하고 있습니다.

또한 해당 인스턴스가 더 이상 필요없을 때(= RC가 0이 되었을 때) ARC가 해당 인스턴스에 할당된 메모리를 해제합니다.

이로써 클래스의 인스턴스는 더 이상 사용하지 않을 때, 메모리를 사용하지 않는다는것을 확신 할 수 있습니다.

하지만 ARC가 사용중인 인스턴스를 할당 해제 하면, 더이상 인스턴스의 프로퍼티 혹은 메소드에 접근 할수 없을 것 입니다.

해당 인스턴스에 접근하려고 시도하면 앱이 crash될 것 입니다.

아직 필요한 인스턴스를 확실하게 사라지지 않도록 하기 위해 ARC는 각 클래스 인스턴스에 관련된 프로퍼티, 상수, 변수들을 추적합니다.

또한 ARC는 인스턴스에 활성화된 참조가 존재한다면 해당 인스턴스를 할당 해제 하지 않습니다.

그렇기 때문에 클래스 인스턴스의 프로퍼티, 상수, 변수들을 Strong Reference 하도록 해야 합니다.


이제 글로만 보면 어려우니 코드로 이해 해 봅시다 😃

ARC Action

Xcode의 Playground를 사용해 코드블록을 Build 해보면 이해가 더 빠릅니다 🤠

class Room {
    let number: String
    init(number: String) {
        self.number = number
        print("\(number) room is being initialized")
    }
    deinit {
        print("\(number) room is being deinitialized")
    }
}

Room Class를 작성하고,

initializer, deinitalizer의 동작을 확인 할 수 있게 간단한 print문을 작성했습니다.

이제 Room class의 instance를 생성해 봅시다.

/*
    instance를 Optional로 선언한 이유는 nil을 할당하여 참조를 해제하기 위해서 입니다.
    또한 선언시에는 아무것도 참조하고 있지 않다는 것을 확실하게 알 수 있습니다.
*/

var room1: Room?
var room2: Room?
var room3: Room?

지금부터 각 instance에 값을 할당함으로써 deinitalizer가 호출되는 시점을 파악해 보겠습니다.

// 1. Room instance 할당
room1 = Room(number: 101)
// print "101 room is being initialized"

// 2. room1을 room2, room3이 참조
room2 = room1
room3 = room2
// Room Class instance가 initialized 되지 않고 이미 생성된 room1을 참조 하였으므로 initializer가 호출되지 않는다.
// 해당 시점에서 Strong Reference는 3(room1, room2, room3)이다.

// 3. room1의 참조 해제
room1 = nil
// Room Class instance를 생성하여 할당한 room1이지만, 해당 instance를 room2와 room3이 참조 하고 있으므로 deinitializer가 호출되지 않는다.
// 해당 시점에서 Strong Reference는 2(room2, room3)이다.

// 4. room2와 room3의 참조 해제
room2 = nil
room3 = nil
// 해당 시점에서 Strong Reference는 0이 되었기 때문에 ARC에서 deallocated시키며, deinitializer가 호출된다.
// print "101 room is being deinitializer"

위 코드로 미루어보아 ARC는 Room(number: 101)에 대한 참조가 모두 사라진 후 해당 instance를 deallocate 하였습니다.

이로써 ARC는 Reference가 모두 사라지면 deallocate 시킨다는것을 확인 할 수 있었습니다.

마무리하며...

이번 포스트는 "ARC가 무엇이며 어떻게 동작하는지" 까지 알아보았습니다!!

하지만 Swift Docs에는 ARC에 대해 더 많은 내용이 기다리고 있습니다. 🤯

그래서 다음 포스트는 Strong Reference로 인해 발생하는

Strong Reference Cycle 입니다!

아직 많은 내용이 있으니 끝까지 공부해서 전부 포스팅 해보겠습니다!!

함께 해주세요 😆

틀린부분이 있다면 언제든지 지적 해주시면 정말 감사하겠습니다 !! 🥺

읽어주셔서 감사합니다!! 🙇‍♂️

profile
hello, iOS

관심 있을 만한 포스트

0개의 댓글