ARC

Groot·2022년 6월 7일
0

TIL

목록 보기
19/148
post-thumbnail

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 메모리 구조

  • Stack 영역
    • 메모리의 Stack 영역은 함수의 호출과 관계되는 지역변수(local variable)와 매개변수(parameter)가 저장되는 영역이다.
  • Heap 영역
    • 메모리의 Heap 영역은 사용자가 직접 관리할 수 있는 (+ 관리해야 하는) 메모리 영역이다.
    • Heap 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. (위키피디아 메모리 동적 할당 참고)
  • Data 영역 / BSS 영역
    • 메모리의 Data 영역은 프로그램의 전역변수(global variable)와 정적변수(static variable)가 저장되는 영역이다.
  • Code 영역
    - 메모리의 Code 영역은 실행할 프로그램의 코드가 저장되는 영역으로 Text 영역이라고도 부른다.
    참고

📌 ARC

  • Swift는 ARC(Automatic Reference Counting)를 사용하여 앱의 메모리 사용량을 추적하고 관리합니다.
  • ARC는 해당 인스턴스가 더 이상 필요하지 않을 때 클래스 인스턴스에서 사용하는 메모리를 자동으로 해제합니다.
  • 참조 카운팅은 클래스의 인스턴스에만 적용됩니다. 구조와 열거형은 참조 유형이 아닌 값 유형이며 참조에 의해 저장 및 전달되지 않습니다.

📍 ARC 방법

  • 인스턴스가 여전히 필요한 동안 사라지지 않도록 하기 위해 ARC는 현재 각 클래스 인스턴스를 참조하는 속성, 상수 및 변수의 수를 추적합니다.
  • ARC는 해당 인스턴스에 대한 활성 참조가 하나 이상 존재하는 한 인스턴스를 할당 해제하지 않습니다.
  • 이를 가능하게 하기 위해 속성, 상수 또는 변수에 클래스 인스턴스를 할당할 때마다 해당 속성, 상수 또는 변수는 인스턴스에 대한 강력한 참조를 만듭니다.
  • 참조는 해당 인스턴스를 확고하게 유지하고 해당 강한 참조가 남아 있는 한 할당 해제를 허용하지 않기 때문에 "강력한" 참조라고 합니다.

📍 강한참조 해결방법 2가지 weak references and unowned references

  • Swift는 클래스 유형의 속성으로 작업할 때 강한 참조 주기를 해결하는 두 가지 방법, 즉 약한 참조와 소유되지 않은 참조를 제공합니다.
  • 약한 참조 및 소유되지 않은 참조를 사용하면 참조 주기의 한 인스턴스가 강한 보유를 유지하지 않고 다른 인스턴스를 참조할 수 있습니다. 그러면 인스턴스는 강력한 참조 주기를 생성하지 않고 서로를 참조할 수 있습니다.
  • 다른 인스턴스의 수명이 더 짧은 경우, 즉 다른 인스턴스가 먼저 할당 해제될 수 있는 경우 약한 참조를 사용합니다.
  • 다른 인스턴스의 수명이 같거나 더 긴 경우에는 소유되지 않은 참조를 사용합니다.

🔗 Weak References

  • 속성 또는 변수 선언 앞에 weak 키워드를 배치하여 약한 참조를 나타냅니다.
  • 약한 참조는 참조하는 인스턴스를 강력하게 유지하지 않기 때문에 약한 참조가 여전히 참조하는 동안 해당 인스턴스가 할당 해제될 수 있습니다.
  • ARC는 참조하는 인스턴스가 할당 해제될 때 약한 참조를 nil로 자동 설정합니다.
  • 약한 참조는 런타임에 값을 nil로 변경할 수 있어야 하기 때문에 항상 선택적 유형의 상수가 아닌 변수로 선언됩니다.

    ARC가 약한 참조를 nil로 설정하면 Property observers가 호출되지 않습니다.

🔗 Unowned References

  • 약한 참조와 마찬가지로 소유되지 않은 참조는 참조하는 인스턴스를 강력하게 유지하지 않습니다.
  • 약한 참조와 달리 소유되지 않은 참조는 다른 인스턴스의 수명이 같거나 더 긴 경우에 사용됩니다.
  • 속성 또는 변수 선언 앞에 unowner 키워드를 배치하여 소유되지 않은 참조를 나타냅니다.
  • 약한 참조와 달리 소유되지 않은 참조에는 항상 값이 있어야 합니다. 결과적으로 값을 소유하지 않음으로 표시해도 선택 사항이 되지 않으며 ARC는 소유되지 않은 참조의 값을 nil로 설정하지 않습니다.

    참조가 항상 할당 해제되지 않은 인스턴스를 참조한다고 확신하는 경우에만 소유되지 않은 참조를 사용하십시오.

📍 ARC 이전의 메모리 관리

  • MRR 방법
    • 직접 코드에서 메모리를 할당하고 해제하는 방법
    • retain : retain count(= reference count) 증가를 통해 현재 Scope에서 객체가 유지되는것을 보장
    • release : retain count(= reference count)를 감소시킴.
    • retain 후에 필요 없을 때 release 함

📍 ARC를 이해해야 하는 이유

  • 코딩을 하면서 메모리 누수 방지를 위해서 이해해야한다

📍 언제 구조체를 선택하고 언제 클래스를 선택해야할까

profile
I Am Groot

0개의 댓글