강한 참조 사이클이란 객체(클래스 인스턴스)가 서로를 참조하는 경우를 말한다.
이 경우 변수의 참조에 nil을 할당해도 메모리가 해제되지 않는 메모리 누수 현상이 발생하게 된다.
class Nation {
var name: String
var person: Citizen?
init(name: String) {
self.name = name
}
deinit {
print("\(name) 메모리 해제")
}
}
class Citizen {
var name: String
var state: Nation?
init(name: String) {
self.name = name
}
deinit {
print("\(name) 메모리 해제")
}
}
var me: Citizen? = Citizen(name: "mila")
var korea: Nation? = Nation(name: "SouthKorea")
me?.state = korea
korea?.person = me
me = nil
korea = nil
위 코드에서 Citizen과 Nation의 참조 카운트는 각각 2가 되었다가, me와 korea에 nil이 할당되면서 카운트는 각각 1로 변경된다.
이 때 두 인스턴스에 접근해서 메모리를 해제하고 싶어도 이미 nil이 할당되어 메모리에 접근이 불가능하다.
이와 같은 경우를 강한 참조 사이클이라고 하고, ARC는 해결하지 못하는 문제이다.
이 강한 참조 사이클 문제를 해결하는 방법으로는 아래 2가지가 있다.