BOID

[swift] 클로저의 강한참조, 강한참조 순환 - HoonIOS 본문

swift 시작기

[swift] 클로저의 강한참조, 강한참조 순환 - HoonIOS

HoonIOS 2021. 4. 1. 15:27
728x90

안녕하세요 HoonIOS입니다 :)

저번 ARC에 대한 포스팅을 할때는 인스턴스끼리의 강한참조를 했는데요, 이번에는 클로저의 값 획득 특성 때문에 발생하는 클로저의 강한 참조, 강한참조의 순환에 대해 알아보겠습니다.

 

클로저의 강한참조란?

- 클로저의 강한참조는 클로저가 인스턴스의 프로퍼티일 때나, 클로저의 값 획득 특성 때문에 발생을 합니다.

 

* 예를들어

- 클로저 내부에서 인스턴스의 프로퍼티에 접근할 때나 클로저 내부에서 인스턴스의 메소드를 호출할때 값 획득이 발생할수 있는데 이 경우 모두 클로저가 self를 통해 획득하므로 강한 참조 순환이 발생을 합니다.

 

- 클로저의 강한참조 순환의 문제가 발생하는 예시를 살펴보겠습니다.

- 결과부터 설명을 하자면 Person 클래스의 인스턴스를 선언해준 Lee 프로퍼티에 nil을 할당해서 주었지만 메모리 해제가 되었다는 deinit이 호출되지 않았으므로 메모리 누수가 일어나고 있는것을 보입니다.

 

- 이제 지연 저장 프로퍼티인 introduce( ) 클로저를 보면은 클로저 내부에서 self 프로퍼티를 사용할수 있었던 이유는 introduce가 지연 프로퍼티였기 때문입니다.

- 클래스 내부에 인스턴스 모두가 초기화 되고 해당 지연프로퍼티를 실행할때 인스턴스가 생기므로 클로저 내부에서는 self 프로퍼티를 통해서만 다른 프로퍼티에 접근을 할수 있습니다.

- 즉, 이부분에서 문제가 발생을 합니다. 클로저의 특성은 자신이 호출되면 언제든지 자신 내부의 참조들을 사용할수 있도록 참조횟수를 증가시켜 메모리에서 해제되는것을 방지합니다.

 

이때!  자신을 프로퍼티로 가지는 인스턴스의 참조 횟수도 증가하기 때문에 강한참조 순환이 발생하기 때문입니다.

 

* 위 예시에서 보면 self.name, self.hobby를 통해 클래스의 프로퍼티를 참조하기 때문에 강한참조 순환이 발생하는것입니다.

 

* 참조

- 클로저 내부에서 self 프로퍼티를 여러번 호출한다고 해도 참조횟수는 한번만 증가를 하게됩니다.

 

클로저의 강한 참조와 강한참조의 순환으로 인한 메모리 누수에 대해 알아봤습니다. 다음에는 클로저의 강한참조 순환을 해결하기 위한 획득 목록에 대해 알아보겠습니다.

 

긴글 읽어주셔서 감사합니다. 수고하세요 :)

 

반응형
Comments