티스토리 뷰

IOS/swift

[Swift] ARC

내일도이렇게 2022. 4. 5. 15:47

ARC (Automatic Reference Counting)

자동으로 메모리 관리해주는 방식으로 필요하지 않는 클래스 인스턴스 를 참조 카운팅을 통해 관리 해주는 기법

더 이상 필요하지 않는 클래스 인스턴스를 메모리에서 해제해준다. 

 

 

강한 참조

참조의 기본은 강한참조로 별도의 식별자를 명시하지 않으면 강한 참조이다. 

class Person {
    var name: String
    var weight: Double
    
    init(name: String, weight: Double) {
        self.name = name
        self.weight = weight
    }
    
    deinit {
        print("\(name) 메모리 해제")
    }
}


var kk: Person? = Person(name: "kk", weight: 60)  //   RC: 1
var mm: Person? = Person(name: "mm", weight: 70)   //    RC: 1


kk = nil   // RC: 0
mm = nil    // RC: 0

인스턴스 생성시 Reference Counting 은 하나씩 올라가고 nil 을 대입한 경우 메모리 해제가 되어 RC는 0 이 된다. 

 

강한 참조 순환 

인스턴스끼리 서로 참조하여 강한 참조 순환이 발생된다.

class Dog {
    var name: String
    var owner: Person?
    
    init(name: String) {
        self.name = name
    }
    
    deinit {
        print("\(name) 메모리 해제")
    }
}


class Person {
    var name: String
    var pet: Dog?
    
    init(name: String) {
        self.name = name
    }
    
    deinit {
        print("\(name) 메모리 해제")
    }
}


var bori: Dog? = Dog(name: "보리")
var gildong: Person? = Person(name: "홍길동")


bori?.owner = gildong
gildong?.pet = bori


 
bori = nil
gildong = nil

bori 와 gildong 이 강한 순환 참조가 되어 자동으로 메모리 해제가 되지 않아 메모리 누수가 발생이된다. 

해결 방안으로 약한 참조와 비소유 참조 키워드를 선언하여 해결한다. 

 

약한 참조 

weak 키워드를 선언하여 인스턴스의 RC의 숫자를 올라가지 않게 한다.

자신이 참조하는 인스턴스가 메모리에서 해제되면 자동으로 nil 을 할당한다. 

 

var 에서와 옵셔널인 경우만 사용이 가능하다. 

class Dog {
    var name: String
    weak var owner: Person?     // weak 키워드 ==> 약한 참조
    
    init(name: String) {
        self.name = name
    }
    
    deinit {
        print("\(name) 메모리 해제")
    }
}


class Person {
    var name: String
    weak var pet: Dog?         // weak 키워드 ==> 약한 참조
    
    init(name: String) {
        self.name = name
    }
    
    deinit {
        print("\(name) 메모리 해제")
    }
}


var bori: Dog? = Dog(name: "보리")
var gildong: Person? = Person(name: "홍길동")


// 강한 참조 사이클이 일어나지 않음
bori?.owner = gildong
gildong?.pet = bori



// 메모리 해제가 잘됨(사실 이 경우 한쪽만 weak으로 선언해도 상관없음)
bori = nil
gildong = nil

 

미소유 참조 

unowned 키워드를 사용하며 약한 참조와 다르게 자신이 참조하는 인스턴스가 메모리에서

해제되더라도 스스로 nil 할당해주지 않는다. 

class Dog {
    var name: String
    unowned var owner: Person
    
    init(name: String) {
        self.name = name
    }
    
    deinit {
        print("\(name) 메모리 해제")
    }
}

class Person {
    var name: String
    unowned var pet: Dog?
    
    init(name: String) {
        self.name = name
    }
    
    deinit {
        print("\(name) 메모리 해제")
    }
}


var bori: Dog? = Dog(name: "보리")
var gildong: Person? = Person(name: "홍길동")


// 강한 참조 사이클이 일어나지 않음
bori?.owner = gildong
gildong?.pet = bori



// 메모리 해제가 잘됨(사실 이 경우 한쪽만 unowned로 선언해도 상관없음)
bori = nil
gildong = nil

 


Reference 

https://velog.io/@kevinkim2586/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-ARC-Automatic-Reference-Counting

https://zeddios.tistory.com/1213

https://www.inflearn.com/course/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-%EB%AC%B8%EB%B2%95-%EB%A7%88%EC%8A%A4%ED%84%B0-%EC%8A%A4%EC%BF%A8/dashboard

 

'IOS > swift' 카테고리의 다른 글

[Swift] GCD ( DispatchQueue) 정리  (0) 2022.04.08
[Swift] 클로저와 메모리 관리  (0) 2022.04.06
[Swift] Method Dispatch 와 성능 최적화  (0) 2022.04.05
[Swift] Optional  (0) 2022.03.22
[Swift] Codable  (0) 2022.03.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함