서로를 순환해서 참조(Strong Reference Cycle)하고 있기 때문에 힙에서 메모리가 해제되지 않아
메모리 누수(Memory Leak)가 발생한다.
swift는 이와 같은 Strong Reference Cycle을 방지해주기 두 가지 방법을 제공해준다.
Weak Reference 와 Unowned Reference
weak와 unowned 키워드는 둘 다 가르키는 인스턴스의 RC를 올라가지 않게 한다.
Weak Reference (약한 참조)
변수 선언시 옵셔널 타입만 가능
참조하고 있던 인스턴스가 해제되면 nil을 자동 할당
// 옵셔널만 가능
class BoostCamper {
let id: String
weak var boostCamp: BoostCamp?
}
class BoostCamp {
let part: String
weak var boostCamper: BoostCamper?
}
Unowned Reference (약한 참조)
변수 선언시 옵셔널과 논 옵셔널 타입 둘 다 가능
참조하고 있던 인스턴스가 해제되면 nil을 자동할당 하지 않음
논 옵셔널일 때도 가르키는 곳의 RC가 안올라기 때문에 가르키는 곳이 비어 있다면 에러 발생
// 옵셔널 논옵셔널 둘 다 가능
class BoostCamper {
let id: String
// unowned var boostCamp: BoostCamp
unowned var boostCamp: BoostCamp?
}
class BoostCamp {
let part: String
// unowned var boostCamper: BoostCamper
unowned var boostCamper: BoostCamper?
}