Value type 인스턴스는 stack에 저장되며 값이 들어 있는 스택의 스코프가 종료되면 메모리에서 자동 제거
reference type과 같이 heap에 저장되는 인스턴스는 따로 관리해야지만 메모리가 해제됨
관리하지 않으면 메모리 누수 현상 발생
→ Reference Counting으로 메모리 관리
시청 추천 영상: ARC 관련 WWDC2016
🔥 Swift에서 사용하고 있는 모델 ARC (Objective-C는 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, reference3 은 reference1이 참조하는 인스턴스에 강한 참조 → reference counting 3reference2 = reference1 // reference counting 2
reference3 = reference1 // reference counting 3
reference2 = nil // reference counting 2
reference3 = nil // reference counting 1
reference1 = nil // reference counting 0
참조 카운트 확인 방법 → CGFGetRetainCount(object) 사용하여 확인