본문 바로가기

iOS 앱 개발자 프로젝트/iOS 숙련

[Swift] ARC (Automatic Reference Counting)

프로그램이 운영체제로부터 할당받는 메모리 공간 구조에 대해 공부하고,

이를 토대로 Swift의 ARC개념을 이해하여 봅니다.


메모리 구조 

 

 

 

 

Swift는 ARC를 사용하여 Heap 영역의 객체 메모리를 자동으로 관리한다. 자세히 풀어 말하자면,

>>  Heap 영역의 객체에 대한 Strong Reference(강한 참조) count를 추적하고, 객체가 더 이상 필요하지 않을 때 (참조 count가 없을 때) 해당 객체에 대한 메모리를 자동으로 해제하는 방식으로 메모리를 관리한다.

 

 

 

📌  Strong Reference (강한 참조)  

 

기본적으로 Swift에서 변수나 상수는 Strong Reference(강한 참조)를 한다.

객체에 대한 Strong Reference(강한 참조) count가 증가되어 있다면, 해당 객체는 메모리에 유지된다.

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var person1: Person? = Person(name: "Alice") // strong 참조
var person2 = person1 // 또 다른 strong 참조

// person1이 nil이 되더라도 person2가 여전히 strong 참조를 가지고 있으므로 객체는 메모리에 유지됨
person1 = nil

 

 

📌  Circular Reference (순환 참조)  

 

ARC 작동 방식의 특성상 두 객체가 서로를 강하게 참조하는 경우, 순환참조가 발생한다.

 

두 객체 모두 더이상 사용되지 않더라도 두 객체가 서로를 강하게 참조하는 경우, Strong Reference count가 감소하지 않아, 메모리에서 해제되지 못하고 메모리가 누수되는 문제가 발생하는데 이러한 문제를 해결하기 위해, 약한 참조(weak reference)미소유 참조(unowned reference) 같은 다른 참조 유형을 사용할 수 있다.

class Person {
    var name: String
    var pet: Pet? // Person이 소유하는 Pet

    init(name: String) {
        self.name = name
    }
}

class Pet {
    var species: String
    var owner: Person? // Pet을 소유하는 Person

    init(species: String) {
        self.species = species
    }
}

var person: Person? = Person(name: "Alice") // Person 클래스의 인스턴스를 생성
var pet: Pet? = Pet(species: "Dog") // Pet 클래스의 인스턴스를 생성

person?.pet = pet // Person 클래스의 pet에 Pet 인스턴스를 할당
pet?.owner = person // Pet 클래스의 owner에 Person 인스턴스를 할당

 

 

📌  Weak Reference (약한 참조)  

 

약한 참조는 Strong Reference(강한 참조)와는 달리 객체의 참조 count 증가시키지 않는다.

객체의 생명 주기에 영향을 주지 않으면서 참조를 유지할 수 있다.

class Person {
    var name: String
    weak var friend: Person? // 약한 참조
    init(name: String) {
        self.name = name
    }
}

var person1: Person? = Person(name: "Alice")
var person2: Person? = Person(name: "Bob")
person1?.friend = person2
person2?.friend = person1

// person1이 메모리에서 해제됨, 그에 따라 person1과 연결된 모든 객체의 참조 카운트가 감소됨
person1 = nil

'iOS 앱 개발자 프로젝트 > iOS 숙련' 카테고리의 다른 글

[iOS] Decodabe, Encodable, Codable  (0) 2024.04.13
[iOS] URLSession  (0) 2024.04.12
[iOS] Core Data stack  (0) 2024.04.12
[iOS] Core Data (+ Modeling Data)  (0) 2024.04.11
[iOS] WishList App (feat. Network &API)  (0) 2024.04.11