티스토리 뷰
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 참조로서 선언된 부분입니다.
두 변수, (john, unit4A)와 두 인스턴스들(Person, Apartment) 사이의 강한참조는 이전 포스팅에서의 상황과 동일하게 생성됩니다.
아래 그림은 tenant변수에 weak 참조를 지정한 이후 john, unit4A가 서로 참조되는 모습을 보여줍니다.
더이상 Person 인스턴스에 대한 강한참조가 존재하지 않기 때문에, Person 인스턴스는 해제되며 Apartment 인스턴스의 weak 참조변수인 tenant변수는 자동으로 nil로 설정됩니다.
이제 Apartment 인스턴스에 유일하게 남은 강한 참조는 unit4A에 있습니다. 만약 unit4A에 nil을 설정하면 Apartment 인스턴스 또한 어떠한 강한참조도 남지 않게 됩니다.
Apartment 인스턴스 또한 어떠한 강한참조도 남아있지 않으므로, Person 인스턴스와 동일하게 Apartment 인스턴스도 참조카운트는 0이 되고, 메모리에서 해제됩니다.
다음 포스팅에서는 unowned reference에 대해서 이어서 다뤄보겠습니다. 많은 의견 환영합니다! 감사합니다. ^-^//
참고 문서 링크 ▼
Swift Automatic Reference Counting
'iOS 개발 > 개발자문서 정보' 카테고리의 다른 글
iOS unowned 참조와 암시적 언래핑 옵셔널 활용하기 (0) | 2020.04.12 |
---|---|
iOS 순환참조 문제 해결방법, 미소유 참조(unowned reference) (0) | 2020.04.11 |
iOS 개발문서 - 강한순환참조(strong reference cycle) 문제 (3) | 2020.04.09 |
iOS 개발문서 - ARC 동작방식과 strong 참조원리 (0) | 2020.04.08 |
Vision과 CoreML로 이미지 분류하기 iOS 문서 읽기 (1) | 2020.04.02 |
- Total
- Today
- Yesterday
- ios
- SwiftUI
- 백준swift
- swift string
- Protocol
- Collection
- swift문제
- swift알고리즘
- 컬렉션
- 프로그래머스
- 프로토콜
- CoreML
- uikit
- 스위프트
- Swift 알고리즘
- 알고리즘
- swift reduce
- 프로그래머스swift
- publisher
- swift언어
- 개발자문서
- createML
- 부스트코스
- 백준알고리즘
- swift 기초
- 자연어처리
- 김프매매
- 알고리즘문제
- swift 문자열
- swift
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |