[Swift] ARC 1편

어흥·2024년 6월 17일

Swift

목록 보기
19/28

메모리 관리가 필요한 이유

Value type 인스턴스는 stack에 저장되며 값이 들어 있는 스택의 스코프가 종료되면 메모리에서 자동 제거

reference type과 같이 heap에 저장되는 인스턴스는 따로 관리해야지만 메모리가 해제됨

관리하지 않으면 메모리 누수 현상 발생

→ Reference Counting으로 메모리 관리

  • Reference Count는 해당 인스턴스를 가리키는(참조)의 갯수를 파악하여 메모리 관리, 해제 시점 결정

시청 추천 영상: ARC 관련 WWDC2016

🔥 Swift에서 사용하고 있는 모델 ARC (Objective-C는 MRC 방식을 사용한다.)

ARC

원리

  1. 인스턴스는 하나 이상의 소유자가 있는 경우 메모리에서 유지
  2. 인스턴스를 가르키는 소유자 수를 카운팅
    • 인스턴스를 가르키는 소유자 수가 0이면 메모리에서 제거되지만 1개 이상이면 메모리 유지

→ 인스턴스에 참조가 하나라도 존재하는 한 인스턴스를 할당 해제 하지 않는다!

참조는 해당 인스턴스를 유지하고 강한 참조가 남아있는 한 할당 해제를 허용하지 않기 때문에 "강한" 참조라고 합니다.

MRC과 차이점

MRC는 메모리를 할당하는 함수 retain(), 메모리를 해제하는 함수 release() 를 개발자가 직접 추가

ARC는 컴파일러가 이러한 메모리 관리 코드를 자동으로 추가

  • 프로그램 메모리 관리 안정성 증가

예시

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 인스턴스에 강한 참조 → reference counting 1
 reference1 = Person(name: "John Appleseed")
 // John Appleseed is being initialized
  • reference2, reference3reference1이 참조하는 인스턴스에 강한 참조 → reference counting 3
reference2 = reference1 // reference counting 2
reference3 = reference1 // reference counting 3
reference2 = nil // reference counting 2
reference3 = nil // reference counting 1
reference1 = nil // reference counting 0
FYI

참조 카운트 확인 방법 → CGFGetRetainCount(object) 사용하여 확인

0개의 댓글