티스토리 뷰
Auto Reference Counting - Part 3
( a.k.a ARC )
Swift 4.2 - The Swift Programming Language (Apple Inc.)
번역
5) 클래스의 인스턴스들 간의 강한 순환 참조 해결하기
(Resolving Strong Reference Cycles Between Class Instances)
Swift provides two ways to resolve strong reference cycles when you work with properties of class type: weak references and unowned references.
Swift 는 여러분들이 클래스 타입의 프로퍼티를 사용하여 작업할 때, 강한 순환 참조를 해결하기 위한 두 가지 방법을 제공합니다.
첫째. Weak(약한) 참조 / 둘째. unowned(미소유) 참조
Weak and unowned references enable one instance in a reference cycle to refer to the other instance without keeping a strong hold on it. The instances can then refer to each other without creating a strong reference cycle.
Weak(약한) 와 unowned(미소유) 참조는 어떤 순환 참조 내 하나의 인스턴스가 다른 인스턴스를 강하게 참조하는 것이 없어도 참조 가능하게 만들어 준다. 그 다음, 인스턴스들은 강한 순환 참조를 생성하는 것 없이도 서로가 참조할 수 있게 된다.
Use a weak reference when the other instance has a shorter lifetime—that is, when the other instance can be deallocated first. In the Apartment
example above, it’s appropriate for an apartment to be able to have no tenant at some point in its lifetime, and so a weak reference is an appropriate way to break the reference cycle in this case. In contrast, use an unowned reference when the other instance has the same lifetime or a longer lifetime.
다른 인스턴스가 짧은 수명을 가질 땐 weak 참조를 사용하세요(즉, 다른 인스턴스가 먼저 할당 해제될 수 있을 때). 앞선 Part 2 에서 Apartment 의 예시처럼, 아파트의 수명의 어느 시점에선 세입자가 없을 수 있고, 그래서 약한 참조는 이러한 경우에 참조 순환을 깰 수 있는 적절한 방식이다. 대조적으로, 미소유 참조는 다른 인스턴스가 같은 수명 혹은 더 긴 수명을 가질 때 사용한다.
Weak References
weak
keyword before a property or variable declaration.nil
when the instance that it refers to is deallocated. And, because weak references need to allow their value to be changed to nil
at runtime, they are always declared as variables, rather than constants, of an optional type.Person
and Apartment
example from above, with one important difference. This time around, the Apartment
type’s tenant
property is declared as a weak reference:아래의 예시는 앞서 살펴본 Person 과 Apartment 예시와 같습니다. 아! 하나의 중요한 차이가 있어요. 이번에는 Apartment 타입의 tenant 프로퍼티가 약한 참조로 선언되어 있어요 :
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { print("\(name) is being deinitialized") }
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
weak var tenant: Person?
deinit { print("Apartment \(unit) is being deinitialized") }
}
The strong references from the two variables (john
and unit4A
) and the links between the two instances are created as before:
두 개의 변수(john & unit4A) 로 부터의 강한 참조와 두 인스턴스의 사이의 연결은 앞선 예처럼 생성되어 있습니다 :
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
Here’s how the references look now that you’ve linked the two instances together:
아래의 그림을 통해 이제 여러분이 연결한 두 인스턴스들의 참조가 어떻게 보여지는지 볼까요?
The Person
instance still has a strong reference to the Apartment
instance, but the Apartment
instance now has a weak reference to the Person
instance. This means that when you break the strong reference held by the john
variable by setting it to nil
, there are no more strong references to the Person
instance:
Person 인스턴스는 Apartment 인스턴스에 대해 여전히 강한 참조를 가지고 있군요, 그러나 Apartment 인스턴스는 이제 Person 인스턴스에 대해 약한 참조를 가지게 되었습니다. 이것은 무엇을 의미할까요? 변수 john 에 의해 잡혀있던 강한 참조를 여러분이 변수에 nil 을 할당함으로서 참조를 해제했을 때, Person 인스턴스에 대해서는 더 이상 강한 참조는 없게 됩니다:
john = nil
// Prints "John Appleseed is being deinitialized"
Because there are no more strong references to the Person
instance, it’s deallocated and the tenant
property is set to nil
:
더 이상 Person 인스턴스에 강한 참조가 없기 때문에, 할당 해제되고 tenant 프로퍼티에는 nil 이 할당됩니다.
Apartment
instance is from the unit4A
variable. If you break that strong reference, there are no more strong references to the Apartment
instance:// Prints "Apartment 4A is being deinitialized"
Apartment
instance, it too is deallocated:Note !
In systems that use garbage collection, weak pointers are sometimes used to implement a simple caching mechanism because objects with no strong references are deallocated only when memory pressure triggers garbage collection. However, with ARC, values are deallocated as soon as their last strong reference is removed, making weak references unsuitable for such a purpose.
주목 !
가비지 컬렉션을 사용하는 시스템에서는(ex. 자바), weak 포인터가 때때로 간단한 캐싱 메커니즘을 수행하기 위해 사용되는데 왜냐면 메모리가 가비지 컬렉션을 작동시킬 때만 강한 참조가 없는 객체가 할당 해제되기 때문입니다. 그러나, ARC 하에서 값은 그들의 마지막 강한 참조가 제거되자마자 할당 해제되어 약한 참조를 만드는 것은 그러한 목적에는 부적합합니다.
번역의 오역에 대한 지적 감사드리겠습니다 !
'Programming > Swift' 카테고리의 다른 글
Swift - (2/3)초보자를 위한 서면면접 정답(Answers of Beginner Written Questions) (0) | 2019.04.27 |
---|---|
Swift - (1/3)초보자를 위한 면접 질문(Interview Questions for Beginner) (0) | 2019.04.25 |
1. Swift : ARC(Auto Reference Counting) (2) (0) | 2018.09.19 |
1. Swift : ARC(Auto Reference Counting) (1) (0) | 2018.09.12 |
1. Swift : JSON (0) | 2018.07.22 |
- Total
- Today
- Yesterday
- 열거형
- function
- swiftUI
- 튜플
- Dictionary
- GCD
- 패캠
- 깃허브
- var
- commit
- 컨버전
- fallthrough
- OOP
- ARC
- fastcampus
- iOS개발스쿨
- 타입
- Swift
- 리터럴
- tca
- 딕셔너리
- 프로그래밍
- lifecycle
- 패스트캠퍼스
- Operator
- array
- inswag
- 스위프트
- 개발스쿨
- ios
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |