ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ARC(Automatic Reference Counting)
    iOS 2021. 12. 20. 20:18

    안녕하세요.

     

    오늘은 ARC에 대해서 알아보도록 하겠습니다.

     

    저는 그동안 자동으로 메모리를 관리해주는 방식으로만 알고 있었는데요.

     

    이건 ARC를 알고 있다고 말할 수 없자나요?

     

    그래서 오늘은 과연 ARC가 무엇인지 좀 더 자세히 알아보도록 하겠습니다.


     

    ARC 공식문서

     

    Automatic Reference Counting — The Swift Programming Language (Swift 5.5)

    Automatic Reference Counting Swift uses Automatic Reference Counting (ARC) to track and manage your app’s memory usage. In most cases, this means that memory management “just works” in Swift, and you don’t need to think about memory management your

    docs.swift.org

     

    ARC는 클래스의 인스턴스에만 적용됩니다.

     

    값 타입과 달리 참조타입은 여러 곳에서 접근이 가능하기에 언제 메모리에서 해제되는지 중요합니다.

     

    ARC 더 이상 참조되지 않는 인스턴스를 메모리에서 해제합니다.

     

    다른 프로그래밍 언어를 사용하신 분들은 비슷한 존재를 아실 것 같은데요.

     

    바로 GC(Garbage Collection)입니다.

     

    GC도 자동으로 메모리를 관리해주는데요.

     

    우선 ARC와 GC를 비교해보겠습니다.


    ARC와 GC의 비교

    ARC와 GC의 가장 큰 차이는 바로 참조 카운팅 시점입니다.

     

    GC는 프로그램 실행 중에 동적으로 메모리를 감시합니다.

     

    반면에 ARC는 놀랍게도 컴파일 시점에 메모리에서 해제되는 시점을 결정합니다.

     

    두 개의 방식이 모두 장단점이 있는데요.

     

    GC의 경우에는 Garbage Collector가 계속해서 메모리를 감시하고 있기 때문에 성능 저하가 발생할 수 있겠죠?

     

    또 정확히 어느 시점에 인스턴스가 메모리에서 해제되는지 예측하기가 어렵습니다.

     

    그러나 계속해서 메모리를 감시하기 때문에 인스턴스가 해제될 가능성이 더 높습니다.

     

    반면에 ARC는 컴파일 시점에 인스턴스 해제 시점이 결정되어 있어 성능 저하는 발생하지 않습니다.

     

    또한 개발자가 메모리에서 해제되는 시점을 알 수 있습니다.

     

    하지만 순환참조가 발생한다면 영원히 인스턴스가 메모리에서 해제되지 않을 가능성이 존재합니다.

     

    애플은 이런 둘 중에서 ARC를 선택했습니다.

    성능을 택한 것이겠지요?


    그런데 과연 ARC는 미래를 예측하는 것도 아니고 어떻게 컴파일 시점에 언제 메모리가 해제되는지를 결정할 수 있을까요?

     

    MRC와 ARC

    원래 Objective-C에서는 왼쪽과 같이 수동으로 retain/release 코드를 작성해야 했습니다.

     

    그러나 Swift에서는 오른쪽과 같이 ARC가 자동으로 컴파일 타임에 적절한 위치에 retain/release 코드를 삽입합니다.

     

    referenceCount는 retain시 1이 증가하고 release시에는 1이 감소합니다.

     

    인스턴스가 새로 생성되거나 다른 변수가 인스턴스를 참조하면 retain 되고

     

    인스턴스를 가르키던 참조가 사라지면 release됩니다.

     

    referenceCount가 0이 될 시 메모리에서 해제됩니다.


    오늘은 ARC에 대해서 알아보았는데요.

     

    혹시 잘못된 점이 있으면 알려주시면 감사하겠습니다.

     

    'iOS' 카테고리의 다른 글

    Storyboard VS Code(Programmatically)  (0) 2021.12.21
    Hugging & Compression Resistance  (0) 2021.12.21
    ViewController Life Cycle  (0) 2021.12.16
    View  (0) 2021.12.15
    Delegate Pattern  (0) 2021.12.14
Designed by Tistory.