[swift] weak 참조의 실제 동작 방식

Swift에서 weak 참조는 다른 객체를 가리키지만, 그 객체를 소유하지 않는 참조 방식을 의미합니다. 이는 주로 강한 순환 참조를 피하기 위해 사용됩니다. 강한 순환 참조는 두 객체가 서로를 강하게 참조할 때 발생하는데, 이는 메모리 누수를 유발할 수 있습니다.

weak 참조는 특히 delegation 패턴이나 클로저에서 자주 활용됩니다. weak 참조는 nil이 될 수 있기 때문에, 옵셔널 타입으로 선언되어야 합니다.

weak 참조의 내부 동작

weak 참조는 내부적으로 zeroing weak reference를 활용하여 구현됩니다. zeroing weak reference는 참조하고 있는 객체가 더 이상 존재하지 않을 때 자동으로 nil로 설정되는 방식입니다. 이를 통해 weak 참조를 통해 접근하는 객체가 메모리 해제될 때 자동으로 nil로 초기화됩니다.

아래는 weak 참조의 내부 동작을 간단히 보여주는 예제 코드입니다.

class Person {
    var car: Car?
}

class Car {
    weak var owner: Person?
}

var john: Person? = Person()
var myCar: Car? = Car()

// 강한 참조
john!.car = myCar
myCar!.owner = john

// myCar 객체를 nil로 설정하여 메모리 해제
myCar = nil

// 이후 myCar.owner는 nil이 됨
print(myCar!.owner) // nil

위 예제에서 myCar를 nil로 설정하여 메모리를 해제한 후 myCar.owner를 출력하면 nil이 출력됨을 확인할 수 있습니다.

결론

weak 참조는 순환 참조와 메모리 누수를 피하기 위한 강력한 도구입니다. 올바르게 활용하여 안정적인 앱을 구축하는 데 도움이 될 것입니다.

참조: