지난번 정리한 내용을 다시 한번 정리해보면..
weak
키워드 사용, 변수에만 사용, 옵셔널이여야 함 -> 자신이 참조하는 인스턴스가 메모리에서 해제될 수 있음, 강한참조 순환문제를 해결할 수 있음그리고 미소유참조도 약한참조와 같이 강한참조 순환 문제의 해결법이면서 참조 횟수를 증가하지 않는다. 하지만 약한 참조는 언제든지 참조하는 인스턴스가 해제될 수 있지만 미소유참조는 참조하는 인스턴스가 항상 메모리에 존재할 것이라는 것을 전제하고 있다. 즉, 인스턴스에 nil을 할당하지 않는다는 것이다. 그래서 옵셔널이나 변수가 아니여도 된다. unowned
키워드를 사용해서 표현한다.
미소유참조는 참조하는 인스턴스가 메모리에 항상 존재하는 것을 전제로 사용하기 때문에 꼭 필요한 관계에서 사용해야 한다. 저번에 사용하던 예제에서 자동차는 사람(차주)를 꼭 필요로하지만 사람은 자동차를 갖고있을 필요가 없다고 한다면 다음과 같이 표현할 수 있다.
차는 사람(차주)를 꼭 갖고 있어야 하기 때문에 Car 클래스의 미소유참조 변수 owner는 미소유참조변수로 선언했고 사람은 차를 갖고있지 않아도 되기 때문에 Person 클래스의 변수 car는 옵셔널변수로 선언했다.
먼저 Person 클래스 인스턴스인 chang
을 생성하면 Person 인스턴스 참조 횟수가 1 증가하게 된다. 그리고 차는 차주를 필요로 하기 때문에 if let
구문을 사용해서 Person 인스턴스가 존재하면 Car 클래스 인스턴스를 생성하도록 했다. 이때, Car 인스턴스 참조 횟수도 1 증가하고 매개변수로 넘어가는 person
상수도 Car 클래스 생성자에서 미소유참조에 할당하는 부분때문에 참조가 발생하지만 미소유참조이기 때문에 참조 횟수는 증가하지 않는다.
그 다음 메모리에서 해제하기 위해서 Person 인스턴스에 nil
을 할당하게 되면 Person 인스턴스 참조횟수가 0이 되면서 해제되고 Person 클래스의 옵셔널 프로퍼티인 car
도 참조횟수가 0이 되면서 Car 인스턴스도 해제가 된다.