티스토리 뷰

반응형

 


Resolving Strong Reference Cycles Between Class Instances
클래스 인스턴스 사이의 강한참조순환 문제 해결하기



weak, unowned 참조는 참조순환 내에 있는 인스턴스를 다른 인스턴스에 대해 강한 참조로 잡고 있지 않도록 할 수 있습니다. 그렇게 되면 인스턴스들은 서로를 참조할 때 강한참조순환 문제가 발생하지 않으면서 참조할 수 있게 됩니다.

참조하는 인스턴스가 짧은 생애주기를 갖는다면, 해당 인스턴스가 가장 먼저 해제 된다면, weak 참조를 사용하세요.
이전 포스팅에서 다루었던 상황에서의 Apartment 예시를 볼 때, apartment 인스턴스의 생애주기 간 tenant 가 없을 수 있기때문에, 참조순환을 방지 하기 위해 weak 참조를 사용하는 것이 적당합니다. 대조적으로, 인스턴스 내 또다른 인스턴스가 상위 인스턴스와 생애주기가 같거나 더 길다면, unowned 참조를 사용하십시오.

 

 


Weak References, 약한 참조

weak 참조는 무언가를 참조할 때, 강한참조를 유지하지 않습니다. 또한 ARC가 참조된 인스턴스를 해제하는 것을 막지 않습니다. 이 행위는 강한참조순환을 방지해줍니다. 당신은 프로퍼티 혹은 변수 선언 앞에 weak 키워드를 붙임으로서 weak 참조를 가리킬 수 있습니다.

weak 참조는 무언가 인스턴스 참조를 할 때 강하게 붙잡고 있지 않기 때문에, weak 참조가 무언가를 참조하고 있는 동안에도 인스턴스를 정상적으로 해제할 수 있습니다. 즉, 인스턴스가 해제될 때, ARC에서는 약한 참조(weak reference)에 대해 자동으로 nil로 설정을 해줍니다.

또한 약한참조는 런타임 중 nil로 변경될 수 있어야 하기 때문에 weak 키워드를 사용할 때는 상수 형태가 아닌 변수 형태로 선언해주어야 합니다. (즉, weak 키워드를 사용할 경우 상수(let)로 선언할 수 없습니다.)

당신은 다른 옵셔널 값과 동일하게 약한 참조 값의 존재를 확인 가능합니다. 또한 더이상 존재하지 않는 유효하지 않은 인스턴스에 대한 참조는 접근할 수 없을 것입니다.

참고 : ARC가 weak 참조를 nil로 설정할 때, 프로퍼티 옵저버(프로퍼티 감시자)는 호출되지 않습니다.


아래의 예시는 위의 Person, Apartment에 대한 예시와 동일하나, 딱 한가지 중요한 차이점이 있습니다. Apartment 타입의 tenant 프로퍼티가 weak 참조로서 선언된 부분입니다.  

 

 

Apartment 클래스의 멤버, tenant는 weak 키워드를 선언해 두었습니다.

 


두 변수, (john, unit4A)와 두 인스턴스들(Person, Apartment) 사이의 강한참조는 이전 포스팅에서의 상황과 동일하게 생성됩니다.

 

 

 


아래 그림은 tenant변수에 weak 참조를 지정한 이후 john, unit4A가 서로 참조되는 모습을 보여줍니다.

 

 

 



 

 

john이 nil이 될때 정상적으로 john의 소멸자가 호출이 됩니다. 

 


더이상 Person 인스턴스에 대한 강한참조가 존재하지 않기 때문에, Person 인스턴스는 해제
되며 Apartment 인스턴스의 weak 참조변수인 tenant변수는 자동으로 nil로 설정됩니다.

 

 

Person이 해제되면서 Apartment 인스턴스의 tenant 변수는 weak 참조였기에 nil로 자동적으로 변환 됩니다. 

 


이제 Apartment 인스턴스에 유일하게 남은 강한 참조는 unit4A에 있습니다. 만약 unit4A에 nil을 설정하면 Apartment 인스턴스 또한 어떠한 강한참조도 남지 않게 됩니다.

 

 

unit4A에 nil를 설정하면, 순환참조 문제가 없고 + 최소한 1개 이상의 강한참조가 존재하지 않으므로 때문에 정상적으로 해제되며 소멸자가 호출됩니다. 

 


Apartment 인스턴스 또한 어떠한 강한참조도 남아있지 않으므로, Person 인스턴스와 동일하게 Apartment 인스턴스도 참조카운트는 0이 되고, 메모리에서 해제됩니다.

 

 

 





다음 포스팅에서는 unowned reference에 대해서 이어서 다뤄보겠습니다. 많은 의견 환영합니다! 감사합니다. ^-^//

 


참고 문서 링크 ▼

Swift Automatic Reference Counting

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함