[Swift] ARC_미소유참조

나는 사과·2021년 3월 25일
0

TIL

목록 보기
12/17

지난번 정리한 내용을 다시 한번 정리해보면..

  • 강한참조 = 기본 참조 방식, 인스턴스가 메모리에 남아있어야 하는 명분을 만듬.
  • 강한참조 순환문제 = 강한참조를 사용할 때, 참조횟수는 0이 아니여서 메모리에 남아있는데 더 이상 인스턴스를 참조할 방법이 없는 문제
  • 약한참조 = 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 인스턴스도 해제가 된다.

0개의 댓글