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