티스토리 뷰

반응형

 

 


Strong Reference Cycles Between Class Instances
클래스 인스턴스 간의 강한 순환참조 문제


지난번 다룬
ARC, strong 참조 관련 포스팅에서 보셨듯이, ARC는 당신이 생성한 새로운 Person 인스턴스 참조의 갯수를 추적할 수 있었습니다. 또한, 해당 인스턴스가 더이상 사용되지 않을 경우, 메모리에서 해제할 수도 있었습니다.

그러나, 클래스 인스턴스가 강한참조의 카운트가 0이 되는 시점을 절.대.로 얻지 못하는 코드를 작성할 가능성이 있습니다. 이는 두개의 클래스 인스턴스들이 서로를 붙잡고 있을때 발생할 수 있습니다. 이때 두개의 인스턴스는 서로 계속 메모리상에서 유지됩니다. 이런 상황을 강한순환참조(Strong Reference Cycle) 라고 합니다.

강한순환참조를 해결하기 위해 이러한 관계 속에서 weak, unowned를 정의할 수 있습니다. 이 과정은 이후 설명되어질 주제, Resolving Strong Reference Cycles Between Class Instances에서 설명되어집니다만, 강한순환참조를 해결하는 방법에 대해 배우기 전에 왜 참조순환이 발생하는지 이해하는 것은 매우 유용하니 참고 하시기 바랍니다.

아래에 우연하게 강한순환참조가 어떻게 발생하는지를 보여주는 예시가 있습니다.
이 예시는 Person, Apartment 두개의 클래스들이 정의되어 있으며, 각각 주민, 아파트를 모델링한 클래스입니다.

 

 


모든 Person 인스턴스는 name: String 프로퍼티, nil로 초기화 되는 apartment: Apartment? 프로퍼티를 갖고 있습니다. person은 항상 apartment를 갖고 있지 않을 수 있기 때문에 nil이 될 수 있는 optional로 선언되어 있습니다.

유사하게, 모든 Apartment 인스턴스는 unit: String 프로퍼티, nil로 초기화되는 tenant: Person? 프로퍼티를 갖고 있습니다. tenant 프로퍼티는 optional입니다. apartment는 항상 tenant를 갖고 있지 않을 수 있기 때문이죠.

이 클래스 둘은 또한 소멸자를 정의합니다. 각각의 소멸자는 Person, Apartment 인스턴스가 각각 메모리에서 해제 될때 해제되었음을 출력으로 알려줍니다.
 이 다음의 코드는 john, unit4A라는 두개의 optional 변수를 정의합니다. 이 변수들은 아래에서 특정 Apartment, Person 인스턴스로 설정될 것입니다. 이 두개의 변수들은 초기 값으로 nil을 갖고 있으며 optional 변수입니다.

 

 


이제 구체적인 Person, Apartment 인스턴스를 만들어 john: Person?, unit4A: Apartment? 변수에 할당할 수 있습니다.

 

 

 


아래 그림은 두 인스턴스가 생성 및 할당 된 후의 강한참조 상태를 보여줍니다. john 변수는 이제 Person 인스턴스에 대한 강한참조를 갖습니다. 또한 unit4A 변수는 Apartment 인스턴스에 대한 강한 참조를 갖습니다.

 

 


이제 두개의 인스턴스를 서로 연결할 수 있습니다. 사람(person)은 아파트(apartment)를, apartment는 세입자(tenant)를 갖게 말이죠.

참고할 부분은 여기서 느낌표(exclamation point)는 옵셔널 변수를 벗기고 저장된 내부 인스턴스, john과 unit4A에 접근하기 위해 사용됩니다.(강제언래핑으로, 해당 방법으로 접근 시 만약 nil일 경우 크래시를 유발할 수 있습니다.) 이로서 해당 인스턴스들의 프로퍼티에 셋팅을 할 수 있게 됩니다.

 

 

 

아래는 두개의 인스턴스를 함께 연결한 뒤의 강한참조의 형태를 보여줍니다.

 

강한참조순환 문제의 시작

 



 

nil로 강한참조를 깨더라도 강한참조순환은 해결되지 않는다.

 


참고할 사항은 결국 john, unit4A가 nil로 설정 되어도 참조카운트는 0이 되지 않으므로 소멸자는 둘다 호출되지 않으며, 강한참조는 Person, Apartment 인스턴스들이 메모리에서 해제되는것을 막게 됩니다. 이는 당신의 앱 내의 메모리 누수를 일으킵니다.

아래 그림은 john, unit4A 변수가 nil로 설정 된 뒤의 강한참조 형태가 어떻게 되는지를 보여줍니다.

 

 

강한순환참조 문제로 메모리가 서로를 잡고 해제되지 못하는 현상이 발생한다. 

 


Person 인스턴스와 Apartment 인스턴스 사이의 강한참조는 여전히 남게 되며 깨지지 않고 유지됩니다.


그렇다면 이러한 문제는 어떻게 해결할 수 있을까요? 다음 포스팅에서 그 해결방안에 대해서 이어서 다뤄보겠습니다. 
많은 의견 환영합니다! 감사합니다. ^-^//


참고 문서 링크 ▼

Swift Automatic Reference Counting

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함