써니쿠키의 IOS 개발일기

[swift] LinkedList에서 head를 nil했을 시 다른 메모리들은 어떻게 될까?? 본문

swift, Ios

[swift] LinkedList에서 head를 nil했을 시 다른 메모리들은 어떻게 될까??

sunnyCookie 2022. 9. 22. 21:39

리뷰어의 질문
나머지는 메모리에 존재하지 않을까요 ? 👀

리뷰어의 질문으로 시작한 나의 메모리 그리기
멋진 답변을 만들고야 말겠어..!!!! 🤓


노드를 이용한 LinkedList가 있다고 할 때,
LinkedList 에서는 값을 전부 지워주고자 할 때 때 head를 nil시켜줍니다.
이렇게..!

mutating func clear() {
        self.head = nil
    }

이 때 head의 다음에 연결되어있는 next 값들은 메모리 상에서 어떻게 될까요 ??


✔️ 우선 제가 짠 코드에서 Node는 class타입이고, LinkedList는 Struct로 구현되어 있습니다.

 

Node가 Class타입으로 구현되어 있기 때문에 swift에서는 멋지고 강력한 ARC에 의해 자동으로 메모리에서 삭제될 것입니다.

 

 ARC의 기본원칙은

  • ✅ 주소가 참조될 때 RC +1이되고,
  • ✅ RC = 0일 때는 자동으로 메모리에서 지우는것입니다.

말로하는 설명보다 그림이 훨씬 이해가 쉬우므로 그림으로 그려보겠습니다
예를들어 3개의 데이터가 LinkedList로 연결되어있고, head를 nil 시켰을 때 메모리의 상태를 차례대로 그렸습니다.

  • Struct인 LinkedList는 head를 스택영역에 저장하고, head의 값으로 힙영역의 첫번째노드의 주소를 갖고있으면서 RC를 +1해줍니다.
  • 첫번째 노드의 next에는 다음 노드의 주소를 참조하고, 이 때문에 두번째 노드의 RC도 1이됩니다.
  • 세번째 노드도 두번째 노드의 next에 주소가 참조되어있기 때문에 RC가 1이됩니다.

  • head가 nil이 되면 첫번째 노드의 주소가 사라지므로 RC -1해주고 첫번째 노드의 RC가 0이 됩니다

  • -첫번째 노드는 RC가 0이라 메모리에서 지워지고 연쇄작용으로 next에서 참조하던 두번째 노드의주소가 지워지면서 두번째 노드의 RC도 0으로 만들어줍니다.

  • 연쇄작용으로 세번째 노드도 RC가 0이됩니다.

  • 결과적으로 모든 데이터들이 메모리에서 지워지게 됩니다.

이런 과정을 거쳐서 head만 nil로 만들어줘도 연결 되어있던 데이터들이 ARC에 의해 자동으로 메모리에서 삭제될 수 있습니다.
( 혹시 틀린부분이나 수정해야 할 부분이 있다면 언제든지 말해주세요 !)

반응형
Comments