안녕하세요👋
꼼꼼한 재은씨 기본편 chapter2를 공부하다 ARC가 궁금해져서 공부를 했습니다!!
참조 카운터는 이전에 공부하다 한번쯤 들어봤는데,, 이번기회에 자세하게 공부해 봐야지~
- Todo : ARC(Auto Referencing Counter
- Auto Referencing Counter 공부 전 필수로 알아야 할 지식!
- ARC의 특징
- ARC가 적절하게 메모리에 할당, 해제 되려면?
- String Reference Cycles Between Class Instance
- Weak 키워드
Auto Referencing Counter 공부 전 필수로 알아야 할 지식!
- Value Type 과 Reference Type에 대해서 알아야 합니다.
- Value Type : Structure, Enum, Tuple ...
Value Type 특징
스택에 저장된다.
스택의 경우 메모리에 저장된 데이터 자동으로 삭제된다.
- Reference Type : Class, Clousre ...
힙에 저장된다.
힙의 경우 특정 인스턴스가 필요하지 않을 경우 개발자가 직접 제거 해야한다.
- Reference Counting 에 대해서 알아야 합니다
인스턴스를 가리키는 프로퍼티가 한개 이상 존재 할 경우 메모리에 유지된다.
인스턴스를 가리키는 프로퍼티가 한 개도 없을 경우 메모리에서 제거되는데, 제거될 시점을 파악하기 위해 참조중인 변수들을 counting한다.
이때 Reference Counting은 오직 reference Type✨ 에 대해서만 지원됩니다.
ARC의 특징
더 이상 필요로 하지 않는 클래스 '인스턴스'의 메모리 저장을 해제할 수 있다.
클래스를 만들게 된 후에 한개의 인스턴스를 만들면 ARC가 인스턴스 정보에 대한 한 덩어리를 메모리에 할당시킨다.
또한 해당 인스턴스와 연관되어 저장된 프로퍼티도 메모리에 ARC에 의해 할당된다.
더 이상 인스턴스가 필요 없을 경우 ARC는 메모리에 사용된 인스턴스를 해방시켜 그 자리에 다른 목적으로 사용될 수 있게한다.
클래스 인스턴스가 더 이상 필요하지 않을 경우 공 간을 차지하지 않도록 빈 공간으로 보장해준다.
🤔 만약 인스턴스가 사용중일 때 ARC가 할당을 해제한다면?
에러가 발생할 것이다.
🔭 그렇다면 인스턴스가 필요로 할 때 사라지지 않는 것을 보장하려면???
적어도 1개의 활동중인, 여전히 존재하는 인스턴스에 대해서는 할당을해제하지 않는다.
이 때 활동중인, 여전히 존재하는 인스턴스는 Reference Countring을 통해 파악할 수 있다.
ARC가 적절하게 메모리에 할당, 해제 되려면?
인스턴스에 대해서 "Strong" reference(강한 참조)로 할당을 하자!!
Strong 참조는 해당 인스턴스를 "확고하게 유지시켜 줄거야!!"
참조중인 동안은 할당 해제 하지 않을 거야!! (Reference Counting)
- iOS는 ARC를 통해 메모리 관리를 한다.
- 인스턴스 메모리 관리는 Reference Counting을 통해 이루어진다.
String Reference Cycles Between Class Instance
강한 참조 간에 Cycle 형성하는 경우 ( 참조 카운트가 어디서 0이 되는지 코드에서 얻을 수 없도록 클래스를 작성한 경우)
각 클래스에서 서로 다른 인스턴스 멤버변수 간 Strong 참조를 할 경우.
🤔 이 경우를 String Reference Cycle이라고 한다.
ARC는 강한 참조간 인스턴스 해제를 하지 않아서 참조 카운트가 증가, 감소하지 않고, 개발자가 직접 nil 처리를 해주어도 강한 참조가 해제되지 않는다.
- 이 경우 해결방법이 있다!! ( 두가지)
- 인스턴스 멤버변수 들 간 Strong 참조를 하는 변수들 중 한개를 Strong 대신 weak , unowned 참조로 바꾸면 강한 참조 cycle을 해결할 수 있다.
Weak 키워드
약한 참조weak의 경우 Optional type로 선언한다!
서로 강한 참조 만드는 것을 미룬다.
인스턴스간 서로 강한참조 cycle 되는 것을 예방할 수 있다.
강한 싸이클이 되는 해당 프로퍼티 선언하기 전에 weak 키워드 선언하자
그렇다면 다른 프로퍼티가 할당 해제 됬을 경우 reference 되고 있는 weak 프로퍼티에 대해서
ARC✨가 자동으로 nil(인스턴스 할당 해제) 처리를 한다.
강한참조로 연결된 A에 대해서 nil 처리를 할 경우
더이상 A B 간에 강한 참조가 없어져 B 또한 nil처리가 된다!!
공식 문서에정말 자세한 예시가 있습니다.
제 Github가 약간의 정리가 있습니다.
'Swift > Deep dive!!' 카테고리의 다른 글
[Swift] 자동, 지정, 편의 초기화(in class). 연쇄 호출 관계 뿌수기!! (0) | 2022.07.09 |
---|---|
[Swift] class 초기화. 왜 super.init()을 쓰는가? (오버로딩, 오버라이딩) (0) | 2022.07.09 |
[Swift] 딕셔너리 [ Int:[Int]] , 2차원 배열에 입력값으로 배열을 입력받는 나만의 팁!! (0) | 2022.04.01 |
[Swift] MVC와 ViewController의 관계 (0) | 2022.03.02 |