강한 순환 참조 (Strong Reference Cycle) 는 어떤 경우에 발생하는지 설명하시오.
Swift iOSInterviewquestions
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 }
var tenant: Person?
deinit { print("Apartment \(unit) is being deinitialized") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
특정 Person
인스턴스와 Apartment
인스턴스를 만들고 할당하면 위 그림과 같이 강력한 참조가 생성된다. 이렇게 만든 인스턴스를 연결하여 Person
인스턴스가 아파트를 갖고 Apartment
인스턴스에 임차인이 있도록 한다.
john!.apartment = unit4A
unit4A!.tenant = john
이렇게 두 인스턴스를 연결하면 두 인스턴스 간에 강한 순환 참조가 생성된다. 그래서 Person
인스턴스와 Apartment
인스턴스의 참조를 끊어도 참조 횟수가 0으로 떨어지지 않는다.
john = nil
unit4A = nil
이러한 강한 순환 참조를 해결하려면 속성을 weak
키워드를 이용해 약한 참조를 한다.
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
weak var tenant: Person?
deinit { print("Apartment \(unit) is being deinitialized") }
}