-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
ARC(Automatic Reference Counting)로 메모리 관리하기
🤔 ARC가 뭔가..?
ARC는 Automatic Reference Counting의 약자로, 자동으로 참조 횟수를 세어 메모리를 관리하는 방식!
쉽게 말해, 객체를 참조하는 곳이 없으면 메모리에서 해제하고, 참조하는 곳이 있으면 메모리에 계속 유지하는 것.
📝 ARC 동작 원리
- 새로운 인스턴스가 생성되면 참조 횟수(Reference Count)가 1이 된다.
- 다른 곳에서 해당 인스턴스를 참조하면 참조 횟수가 1 증가.
- 참조하던 곳에서 더 이상 참조하지 않으면 참조 횟수가 1 감소.
- 참조 횟수가 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
Labels
No labels
