Skip to content

ARC로 메모리 관리  #48

@zzangzzangguy

Description

@zzangzzangguy

ARC(Automatic Reference Counting)로 메모리 관리하기

954f5c842d34fffa72c88f03fe008787

🤔 ARC가 뭔가..?

ARC는 Automatic Reference Counting의 약자로, 자동으로 참조 횟수를 세어 메모리를 관리하는 방식!

쉽게 말해, 객체를 참조하는 곳이 없으면 메모리에서 해제하고, 참조하는 곳이 있으면 메모리에 계속 유지하는 것.

📝 ARC 동작 원리

  1. 새로운 인스턴스가 생성되면 참조 횟수(Reference Count)가 1이 된다.
  2. 다른 곳에서 해당 인스턴스를 참조하면 참조 횟수가 1 증가.
  3. 참조하던 곳에서 더 이상 참조하지 않으면 참조 횟수가 1 감소.
  4. 참조 횟수가 0이 되면 메모리에서 해제.
class Person {
    let name: String
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}

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

reference1 = Person(name: "John Appleseed")// RC: 1
reference2 = reference1// RC: 2
reference3 = reference1// RC: 3

reference3 = nil// RC: 2
reference2 = nil// RC: 1
reference1 = nil// RC: 0, Person 인스턴스 메모리에서 해제

🎯 ARC가 적용되는 곳은?

ARC는 클래스의 인스턴스에만 적용된다. 즉, 참조 타입인 클래스에서만 동작하는 것.

구조체나 열거형 같은 값 타입에는 적용되지 않는다. 값 타입은 참조가 아니라 복사되기 때문!

그리고 ARC는 Heap 영역의 메모리만 관리한다. Heap은 참조 타입의 인스턴스가 저장되는 곳이거덩요..

🤨 근데 ARC가 컴파일 시점에 동작하는 거 아니냐..?

ARC는 컴파일 시점에 동작한다. 하지만 실제 메모리 관리는 런타임에 이루어진다...

컴파일러가 컴파일 시점에 코드를 분석해서 적절한 위치에 메모리 관리 코드(retain, release 등)를 삽입해 주는 것.

그리고 이 삽입된 코드가 런타임에 실행되면서 참조 횟수를 관리후, 참조 횟수가 0이 되면 메모리에서 해제하는 식.

😵 그래도 ARC가 좀 어렵네요...

ARC는 개발자 대신 메모리 관리를 자동으로 해주기 때문에 코드 작성이 훨씬 편해지긴한다...

하지만 메모리 관리를 완전히 잊어버려도 되는 건 아님... ARC를 사용하더라도 강한 참조 순환(Strong Reference Cycle) 문제는 여전히 발생할 수 있기때문.

그래서 클로저에서의 캡처 리스트라든가, 강한 참조/약한 참조/미소유 참조 같은 개념은 꼭 알아둬둬야 한다…..

😄

🌳 결론

  • ARC는 Swift의 메모리 관리 방식으로, 참조 횟수를 자동으로 관리.
  • ARC는 클래스의 인스턴스에만 적용되며, Heap 영역의 메모리를 관리.
  • ARC는 컴파일 시점에 동작하지만, 실제 메모리 관리는 런타임에 이루진다.
  • ARC를 사용하더라도 강한 참조 순환 등의 메모리 관련 이슈는 주의해야 한다..

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions