[250415] ARC

ON&OFF·2025년 4월 15일

iOS TIL

목록 보기
13/18

1. 오늘 배운 것

Reference count

  • 인스턴스가 생성되면, 메모리를 할당받게 되고 해당 인스턴스에 대한 reference count가 증가하게 된다.
    class MyClass() {...}
    var myClass : MyClass? = MyClass() // Reference Count = 1
  • 인스턴스를 참조하는 경우 reference count가 증가한다.
    var myClass2 = myClass // Reference Count = 2
  • 변수에 nil을 할당해줘서 인스턴스를 해제해주면 reference count가 감소한다.
    myClass = nil // Reference Count = 2-1 = 1

    인스턴스가 최종적으로 메모리에서 해제되면 reference count가 0이 된다

ARC (Automatic reference count)

  • ARC 는 Swift 의 메모리 관리 시스템. Java 에 GC 가 있다면 Swift 에는 ARC 가 있음.
    • Reference Count 를 자동으로 계산. (Automatic)
      • 객체가 생성될 때 RC 가 1 로 설정
      • 객체가 다른 변수나 속성에 할당되어 참조될때마다 RC 가 1 씩 증가
      • 객체에 대한 참조가 해제될때마다 RC 가 감소
      • RC 0 이 되면 더 이상 사용되지 않는 것으로 간주되어 메모리에서 해제.

MRC (Manual Reference Counting)

  • MRC 는 Objective-C 에서 사용하는 메모리 관리 시스템.
    • Reference Count 를 개발자가 코드로 직접 계산. (Manual)
      • 객체가 생성될때 개발자가 명시적으로 메모리 할당
      • 객체를 다른 변수나 속성에 할당되어 참조될때마다 개발자가 명시적으로 RC 증가
      • 객체에 대한 참조가 해제될때마다 개발자가 명시적으로 RC 감소
      • RC 가 0 이되면 개발자가 명시적으로 메모리에서 해제.

순환 참조

  • A 가 B 를 참조하고 (A→B),B 가 A 를 참조해서 (B→A), 서로가 서로를 참조하는 상황을 순환 참조라고 한다.
  • 일반적으로 순환 참조는 메모리 누수를 발생시키는 대표적인 사례다.
class Person {
    var pet: Dog?
    init() {
        print("Person 클래스 생성")
    }
    deinit {
        print("Person 클래스 소멸")
    }
}
class Dog {
    var owner: Person?
    init() {
        print("Dog 클래스 생성")
    }
    deinit {
        print("Dog 클래스 소멸")
    }
}
// person rc = 1
var person: Person? = Person()
// dog rc = 1
var dog: Dog? = Dog()
// dog rc = 2
person?.pet = dog
// person rc = 2
dog?.owner = person
// person rc = 1
person = nil
// dog rc = 1
dog = nil

약참조와 강참조

순환 참조와 같은 문제를 해결하기 위한 참조 기능

  • 약참조
    • Reference Count 를 증가시키지 않으면서 참조하는 것.
    • weak 키워드를 붙여서 약참조를 할 수 있다.
  • 강참조
    • Reference Count 를 증가시키면서 참조하는 것.
    • 일반적인 참조 방식을 말한다.

2. 배우며 겪은 문제점/의문점

자동으로 메모리 관리를 해주는데 왜 굳이 또 매뉴얼로 관리를 해줘야 하는지 약간 이해가 가지 않았다.

3. 해결 방법

ARC만으로는 해결되지 않는 상황이 있어 항상 신경써서 메모리 관리를 해주어야 한다.

4. 느낀 점

ARC가 자동으로 관리해준다고 안심하지 말고 메모리 관리에도 신경을 기울여야 더 좋은 개발자가 될 수 있을 것 같다.

5. 다음에 진행할 것

CRUD에 대해 공부해 볼 예정~!

profile
안 되면 될 때까지

0개의 댓글