[Swift] ARC_약한참조

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

TIL

목록 보기
11/17

지난 강함참조로 인해서 발생하는 문제점인 강한참조 순환문제를 해결하기 위한 방법으로 수동으로 인스턴스를 해제하면서 해결하는 방법이 있지만 코드가 길어지면서 인스턴스가 많아지게 되면 놓치는 부분이 발생할 수 있기 때문에 다른 방법인 약한참조와 미소유 참조가 있다고 했다. 그래서 이번엔 약한참조에 대해 정리해보려고 한다.

약한참조 = 자신이 참조하는 인스턴스의 참조 횟수를 증가시키지 않는다.
참조가 이루어지면 참조 횟수가 증가하고 nil을 할당하면 감소하기도 하는데 약한참조를 이용하면 이 참조 횟수가 증가하지 않는다. 약한참조는 참조 타입의 프로퍼티나 변수 앞에 weak 키워드를 붙여주면 된다. 약한참조는 메모리에서 해제가 되면 nil이 할당 될 수 있어야 하기 때문에 꼭!! 변수여야만하고 상수는 불가능하다. 그리고 nil이 될 수도 있기 때문에 옵셔널이어야 한다.

어제 사용했던 예제에서 간단하게 Person 클래스의 참조 타입의 프로퍼티인 car 앞에다가 weak 키워드를 붙여 약한참조로 선언해주었다.

class Person{
    let name: String
    weak var car: Car? 	// 약한참조 타입 프로퍼티
    
    init(name: String){
        self.name = name
        print("\(name)이 생성되었습니다.")
    }
    
    deinit{
        print("\(name)이 해제되었습니다.")
    }
}

다음, 각각의 클래스의 인스턴스를 생성하고 각 클래스의 참조타입 프로퍼티에 각각의 인스턴스를 할당해준다.

var tesla: Car? = Car(company: "tesla")
// tesla가 생성되었습니다.
// Car 인스턴스 참조 횟수 = 1
var chang: Person? = Person(name: "chang")
// chang이 생성되었습니다.
// Person 인스턴스 참조 횟수 = 1

tesla?.owner = chang
// Person 인스턴스 참조 횟수 = 2
chang?.car = tesla
// Car 인스턴스 참조 횟수 = 1

여기서 chang?.car = tesla 부분은 Person 클래스의 참조타입 프로퍼티가 weak 약한참조로 선언되어 있어서 참조 횟수가 증가하지 않는다.

tesla = nil
// Car 인스턴스 참조 횟수 = 0, Person 인스턴스 참조 횟수 = 1
print(chang?.car) 
// nil

Car 인스턴스에 nil을 할당하면 Car 인스턴스 참조 횟수는 감소하고 Car 인스턴스의 참조타입 프로퍼티인 owner도 해제가 되면서 Person 인스턴스 참조 횟수도 감소하게 된다.
그래서 Car 인스턴스 참조 횟수가 0이 되면서 메모리에서 해제가 되고 chang?.car을 출력하면 nil이 출력된다.

실행결과를 다시 보면

각각의 인스턴스들이 생성이 되고 해제까지 잘 이루어진 모습을 볼 수 있습니다.

0개의 댓글