Swift의 Memory - 강한 참조 사이클(Strong Reference Cycle)

June·2023년 3월 10일
0

Swift

목록 보기
8/18
post-thumbnail

강한 참조 사이클

강한 참조 사이클이란 객체(클래스 인스턴스)가 서로를 참조하는 경우를 말한다.
이 경우 변수의 참조에 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가지가 있다.

  • (weak) 약한 참조
  • (unowned) 비소유 참조
profile
안다고 착각하지 말기

0개의 댓글