yoogail105 / KkokkoSwift

꼬리에 꼬리를 무는 swift 개념 정리
28 stars 0 forks source link

# 순환 참조의 오류(strong, weak, unowned) #22

Open yoogail105 opened 2 years ago

yoogail105 commented 2 years ago

순환 참조의 오류

Strong 강한참조

순환참조

*ARC의 단점: 순환참조 시 영구적으로 메모리가 해제되지 않을 수 있다.

예시를 통해 살펴보자. image

image

그런데 여기에서 image

⇒ 이렇게 두 객체가 서로가 서로를 참조하게 된 상황이 바로 순환 참조이다!

yoogail105 commented 2 years ago

강한 순환 참조의 오류

위의 승관이와 부석순의 예제로 돌아가 보자. 승관이와 부석순의 활동이 끝나고 휴식기임. nil을 할당.

image

??
이게 바로 문제 상황인데, 무엇이 문제인지 살펴보면

yoogail105 commented 2 years ago

강한 순환 참조의 오류 해결 1

약한참조 weak

강한 순환 참조의 오류를 weak으로 해결하는 방법

승관이와 부석순의 예제에서는 bbu = nil을 먼저 작성했기 때문에, Singer인스턴스의 수명이 더 짧다. 그러므로 group에 weak을 붙여준다.

image

요런 상황... Group의 member 변수가 nil이 될 수 있으니, weak으로 선언한다.

image

작동 원리?

처음부터 살펴보면, image 승관이라는 이름을 가진, Singer bbu 인스턴스 생성 Singer RC + 1 ⇒ Signer RC = 1 부석순이라는 이름을 가진, Group booseoksoon 인스턴스 생성 Group RC + 1 ⇒ Group RC = 1

윗 부분은 강한 순환 참조의 첫 단계와 똑같음. 중요한 것은 지금이다. image

이제 nil을 통해 해제해 보겠음. image

이렇게 하면, 안전하게 메모리를 해제할 수 있어, 불필요한 메모리 누수를 막을 수 있다.

❗️주목❗️

    booseoksoon?.member = bbu
    bbu = nil
    booseoksoon?.member
image
yoogail105 commented 2 years ago

강한 순환 참조의 오류 해결 2

미소유참조 unowned

❗️주의❗️

yoogail105 commented 2 years ago

🔖 참고

yoogail105 commented 2 years ago

Retain Count