카테고리 없음

ARC 와 Class의 주의할점 Class vs Struct 차이점 4 -1

양시관 2024. 3. 11. 14:32

swift의 메모리 관리 중 순환참조(Circular reference)와 약한참조(Weak reference) 미소유 참조(Unowned reference) 는 각각 어떤 상황에서 사용되며, 왜 필요한가요?

 

Swift의 메모리 관리에서 순환 참조,약한 참조, 그리고 미소유 참조(Unowned Reference) 들의 가장 큰 이유는 안전성입니다. 이 개념들은 메모리 누수를 방지하고 더욱 효율적으로 메모리를 관리하기 위해서 사용합니다.

 

순환 참조 (Circular Reference)

순환 참조는 두 개 이상의 인스턴스가 서로를 강하게 참조하고 있어 서로의 생명 주기가 끝나지 않아 메모리에서 해제되지 않는 상황을 의미합니다 이러한 이유 때문에 메모리 누수가 생길 수 있게 됩니다.

예를 들게 되면 부모 객체가 자식 객체를 강하게 참조하고, 동시에 자식 객체가 부모 객체를 강하게 참조하는 경우, 둘 다 메모리에서 해제되지 않아 순환 참조가 발생합니다 이건 저번 포스팅에서도 간단하게 설명 했습니다. 

약한 참조 (Weak Reference)

코드를 사용하다보면 순환참조를 해결해야할경우가 생기게 되는데 이를 해결하기 위해 약한 참조를 사용하게 됩니다. 약한 참조는 참조 카운트를 증가시키지 않으므로, 인스턴스가 다른 객체에 의해 유일하게 소유되지 않도록 하게됩니다. 일반적으로 부모-자식 관계에서 '부모 → 자식'은 강한 참조를 사용하고, '자식 → 부모'는 약한 참조를 사용합니다. 이해하기 힘들다면 약간의 인간세계의 이해관계를 생각해보니 이해하기가 편했습니다.

약한 참조는 weak 키워드를 사용하여 선언되며, 참조하는 객체가 메모리에서 해제되면 자동으로 nil이 되는게 메모리를 해제한다 라는 의미이기 때문에 이는 주로 delegate 패턴과 같이 참조 사이클을 형성할 수 있는 상황에서 사용됩니다.

미소유 참조 (Unowned Reference)

순환참조를 방지하기위한 두번째 방식이 미소유 참조입니다. 하지만 약한 참조와 다르게, 미소유 참조는 참조하는 인스턴스가 항상 메모리에 존재할 것이라고 가정합니다. 미소유 참조는 nil을 할당할 수 없으며, 참조하는 인스턴스가 해제되면 더 이상 안전하지 않습니다.

unowned 키워드를 사용하여 선언되며, 주로 두 인스턴스의 생명 주기가 서로 같을 때 사용됩니다. 예를 들어, 한 객체가 다른 객체 없이는 존재할 수 없는 상황인데 이 예시를 들자면 항상 같이 생성되고 같이 소멸하는 경우등에서 사용됩니다.

왜 필요한가?

  • 순환 참조는 메모리 누수로 이어져 애플리케이션의 성능을 저하시킬 수 있습니다. Swift는 자동 참조 카운팅(ARC)을 사용하여 메모리를 관리하지만, ARC는 순환 참조를 자동으로 해결하지 못합니다.
  • 약한 참조와 미소유 참조는 이러한 순환 참조를 방지하기 위해 필요합니다.
  • 약한 참조는 참조하는 객체가 메모리에서 해제될 있음을 나타내며, 미소유 참조는 참조하는 객체가 같은 또는 생명 주기를 가질 것이라는 것을 나타내게 됩니다. 
    이러한 이유등으로 참조의 방식들이 필요하며 이를 해결을 해야 앱의 성능을 상승시키는것에 고민을 하는 개발자가 될 수 있다고 생각을 합니다.