RC (Reference Counting)
ARC와 MRC에 들어가있는 RC는 메모리 관리 시스템의 핵심이 되는 개념임
인스턴스는 하나 이상의 참조자(소유자 = owner)가 있어야 메모리에 유지 된다.
만약 소유자가 없다면? -> 즉시 메모리에서 제거 됨
이때 인스턴스를 참조하고 있는 소유자의 개수를 RC(reference count)라고 한다.
이 말은?
reference count > 0 -> 메모리에 살아있음
reference count = 0 -> 메모라에서 삭제됨
그렇기 때문에, 더 이상 사용하지 않을 인스턴스의 RC가 0보다 크지 않도록 주의해야겠지?
움, 그럼 만약 0보다 크게되면 어떻게 되는거야?
그렇게 되면 메모리 누수가 발생함
실제로 "순환 참조(Circular Reference)"라는 것이 있는데
요게 뭐냐면, 두 인스턴스가 서로를 강하게 참조함으로써, 참조 카운트가 0이 되지않아
메모리에서 해제되지 않는 상황을 일컫는 말 임
이를 방지하기 위해
약한 참조(Weak Reference)와 미소유 참조(Unowned Reference)
이 두 친구를 활용 할 예정임
음음 역시 한 키워드를 알려면 내용이 굉장히 딥해지는군,,
자, 그러면 어차피 다음 내용들을 알기위해 강한참조와 약한참조를 알고있으면 이해가 쉬우니까
내용을 한번 다뤄볼까?
1. 강한 참조(Strong Reference)
기본적으로 모든 참조는 강한 참조임.
이 친구는 참조 카운트(RC)를 증가시킴
2. 약한 참조(Weak Reference)
딜리게이트 패턴 하면서 'weak'라는 키워드를 많이 사용했었죠?
같은거임. 약한 참조는 참조 카운트(RC)를 증가시키지 않음
-> 참조 대상이 메모리에서 해제될 때 자동으로 'nil'로 설정
3. 미소유 참조(Unowned Reference)
'unowned' 키워드를 사용하여 선언
미소유 참조는 참조 카운트를 증가시키는 않지만, 참조 대상이 해제된 후에도 'nil'로 설정되지 않는다.
따라서 런타임 오류의 위험이 있을수도 있음
Q -> 얘네를 Xcode에서 확인할 수 있나요?
네. 있습니다!
요거 활용하면 될 것 같은데 아직까진 잘 모르겠슴당
대충 굵은선이 강한 참조 얇은선이 약한 참조 라고 들었던 것 같은데
나중에 더 자세히 알아보도록 하죠?
ARC (Automatic Reference Counting)
ARC는 이름처럼 Swift에서 메모리 관리를 자동으로 처리하는 메커니즘임.
이 친구는 RC를 사용하여 인스턴스의 메모리 생명 주기를 관리하며, 인스턴스가 언제 메모리에서
해제 되어야 하는지를 결정함.
ARC는 컴파일 타임에 작동하며, 인스턴스가 더 이상 사용되지 않을 때
자동으로 메모리를 해제하여 메모리 누수를 방지함
설명
14번 라인에 var ds: DS? = DS() 인스턴스가 생성되어 참조 카운트가 1이 된다
24번에 'ds'가 'nil'로 설정되어 참조 카운트가 0이되어
인스턴스가 메모리에서 해제 되어 "클래스 소멸" 프린트 출력이 된다.
MRC (Manual Reference Counting)
MRC 는 Objective-C 에서 사용하는 메모리 관리 시스템이다.
요 친구는 ARC가 도입되기 이전에 Objective0C에서 사용되었는데,
RC가 0이 되면 개발자가 명시적으로 메모리에서 해제시켜야 한다.
Q -> 그러면 ARC는 자동으로 RC를 카운팅해서 메모리를 관리해주는 시스템이니까,
개발자는 메모리 관리에 대해 신경 쓰지 않아도 되는거 아닌가요?
A-> 놉, ARC로 잡아내지 못하는 메모리 누수 상황이 발생할 수 있기 때문에
개발자는 메모리 관리 방법을 반드시 알아야 한다!
오늘 포스팅은 여기서 끝!
'Swift' 카테고리의 다른 글
Swift UserDefaults (0) | 2024.07.11 |
---|---|
Swift CoreData (0) | 2024.07.10 |
(CS) 네트워크 대비 지식쌓기 (1/2) (0) | 2024.07.07 |
Xcode 내 휴대폰 연동 (0) | 2024.07.01 |
Swift Delegate Pattern (0) | 2024.06.30 |